我应该在C中优化循环。循环如下:
#define N_TIMES 600000
#define ARRAY_SIZE 10000
for (i = 0; i < N_TIMES; i++) {
for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=2) {
sum += *ptr;
sum1 += *ptr + 1;
}
}
sum += sum1;
我们已经介绍了3种类型的优化:循环展开,循环拆分和在循环中使用指针。我已经成功实现了指针和拆分(循环现在比以前快了大约50%),但每次我尝试展开循环时,我的速度都没有提升。这是我一直在尝试的:
for (i = 0; i < N_TIMES; i++) {
for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=4) {
sum += *ptr;
sum += *ptr + 1;
sum1 += *ptr + 2;
sum1 += *ptr + 3;
}
}
这似乎什么都不做。我只是完全误解了什么循环展开,或者我应该继续在循环声明中将ptr递增2直到它工作?任何和所有的帮助表示赞赏!
另外,我知道编译器在当今世界中进行了大部分优化,但这是一个类的任务,我必须这样做。
答案 0 :(得分:2)
一,你没有正确展开循环。它应该是:
for (i = 0; i < N_TIMES; i++) {
for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=4) {
sum += *ptr;
sum1 += *ptr + 1;
sum += *(ptr+2);
sum1 += *(ptr+2) + 1;
}
}
显然可能原始循环不是你真正想要的。但是因为你错误地翻译它,如果数组元素是双精度的(如果你告诉我们会很好),原始循环每次迭代执行3次浮点操作,错误展开的循环每次迭代执行7次浮点指针操作,显然是一半许多迭代,仍然有16.7%的浮点运算。