Я не уверен , почему вы не можете использовать оптимизатор, поскольку, по моему опыту, он, как правило, будет генерировать более быстрый код, чем подавляющее большинство "желающих" ручных оптимизаторов :-) В Кроме того, вы должны убедиться, что этот код является на самом деле проблемной областью - нет смысла оптимизировать код, который уже близок к максимальной скорости, и при этом вам не следует беспокоиться о том, что составляет 0,01% времени, затрачиваемого на в другом месте может быть код, ответственный за 20%.
Оптимизация должна быть нацелена, иначе это бесполезное усилие.
Любое решение, кроме наивного "просто сложить числа", скорее всего, будет использовать специальные функции в целевом ЦП.
При условии, что вы готовы к небольшому удару при каждом обновлении массива (и это может быть не вариант, учитывая ваш комментарий "все значения были инициализированы"), вы можете получить сумму в очень быстрое время. Используйте "класс", чтобы поддерживать массив и сумму рядом. Псевдокод вроде:
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
против максимума.