gpt4 book ai didi

c - 改进数组计算的处理时间

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:43 25 4
gpt4 key购买 nike

代码是这样的sum += 数组[j] + 数组[j+1] + 数组[j + 2]+ ... 数组[j + n];如何替换括号内的 j+n 以改善时序?

最佳答案

不要这样做。除非你有一个脑死亡的编译器,否则它应该能够充分优化这一点。

如果您要进行这种级别的微优化,您需要开始查看底层汇编代码,而不是假设您的编译器会盲目地将您的代码转换为完全等效的汇编代码代码。

你还需要比编写你的编译器的人更了解你的目标平台的复杂性,坦率地说,基于我看到的来自 gcc 的高优化级别的疯狂代码,不太可能 :-)

如果您专注于算法选择等全局优化,您通常会获得更好的投资返回。

应该做的(如果您还没有做的话)是分析代码,一旦完成,看看瓶颈在哪里(只有表现不佳时:优化已经足够快的东西是没有意义的)。

然后专注于那些瓶颈。 测量,不要猜测!


举例来说,我实际上是要向您展示以下代码的优化程度:

#include <stdio.h>
int main(void) {
int j, sum, array[50];
for (j = 0; j < 50; j++)
array[j] = 999 - j * 2;
j = 22;
sum = array[j] + array[j+1] + array [j + 2] + array[j + 3];
return 0;
}

但在 gcc 优化级别 3 下,它变成了:

main:
pushl %ebp ; prolog
xorl %eax, %eax ; return value
movl %esp, %ebp ; epilog 1
popl %ebp ; epilog 2
ret

是的,没错,就是stack prolog和epilog的代码以及返回值的设置,看不到任何计算。 gcc 已经(正确地)发现任何计算都不会在任何地方使用,因此已将它们优化为完全不存在。


一旦你使用它,相关代码就变得简单了:

movl    116(%esp), %eax
addl 112(%esp), %eax
addl 120(%esp), %eax
addl 124(%esp), %eax

你很难让它比这更优化。

关于c - 改进数组计算的处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com