我不确定为什么你不能使用优化器,因为根据我的经验,它通常会生成比大多数“自称”手动优化者更快的代码 :-) 另外,你应该确保这段代码实际上是一个问题区域 - 优化已经接近最大速度的代码没有意义,也不应该关注占用时间0.01%的代码,可能有其他代码占用了20%的时间。
优化应该有针对性,否则就是浪费努力。
除了天真的“只需将数字相加”的解决方案之外,大多数情况下都需要使用目标CPU的特殊功能。
如果你愿意在每次数组更新时承受一点小的损失(鉴于你的“所有值都已初始化”的评论,这可能不是一个选项),你可以非常快地得到总和。使用一个“类”来同时维护数组和总和。伪代码如下:
def initArray (sz):
allocate data as sz+1 integers
foreach i 0 thru sz:
set data[i] to 0
def killArray(data):
free data
def getArray (data,indx):
return data[indx+1]
def setArray (data,indx,val):
data[0] = data[0] - data[indx] + val
data[indx+1] = val
def sumArray(data):
return data[0]
应该可以解决问题。
以下完整的C程序展示了一个非常粗略的第一次尝试,您可以将其用作更健壮解决方案的基础:
#include <stdio.h>
#include <stdlib.h>
static int *initArray (int sz) {
int i;
int *ret = malloc (sizeof (int) * (sz + 1));
for (i = 0; i <= sz; i++)
ret[i] = 0;
return ret;
}
static void killArray(int *data) {
free (data);
}
static int getArray (int *data, int indx) {
return data[indx+1];
}
static void setArray (int *data, int indx, int val) {
data[0] = data[0] - data[indx] + val;
data[indx+1] = val;
}
static int sumArray (int *data) {
return data[0];
}
int main (void) {
int i;
int *mydata = initArray (10);
if (mydata != NULL) {
setArray (mydata, 5, 27);
setArray (mydata, 9, -7);
setArray (mydata, 7, 42);
for (i = 0; i < 10; i++)
printf ("Element %d is %3d\n", i, getArray (mydata, i));
printf ("Sum is %3d\n", sumArray (mydata));
}
killArray (mydata);
return 0;
}
这个的输出是:
Element 0 is 0
Element 1 is 0
Element 2 is 0
Element 3 is 0
Element 4 is 0
Element 5 is 27
Element 6 is 0
Element 7 is 42
Element 8 is 0
Element 9 is -7
Sum is 62
就像我所说的,这可能不是一个选择,但如果你能做到的话,你很难找到比单个数组索引提取更快的方法来获取总和。
而且,只要你正在实现一个类来完成这个任务,你也可以使用前两个元素进行一些管理工作,一个用于当前总和,另一个用于最大索引,这样你就可以通过检查indx
是否超出最大值来避免越界错误。
fork
吗? - sje397-msse4
选项。 - Anycorn