我不确定为什么你不能使用优化器,因为根据我的经验,它通常会比绝大多数“想要成为”手动优化器产生更快的代码 :-)此外,您应该确保此代码 实际上是一个问题区域 - 没有必要优化已经接近最大速度的代码,也不应该担心占时间的 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 与最大值来避免越界错误。