两部分我的问题.哪个更有效/更快:
int a,b,c,d,e,f;
int a1,b1,c1,d1,e1,f1;
int SumValue=0; // oops forgot zero
// ... define all values
SumValue=a*a1+b*b1+c*c1+d*d1+e*e1*f*f1;
Run Code Online (Sandbox Code Playgroud)
要么
Sumvalue+=a*a1+b*b1+c*c1;
Sumvalue+=d*d1+e*e1*f*f1;
Run Code Online (Sandbox Code Playgroud)
我猜第一个是.我的第二个问题是为什么.
我想第三个问题是,在任何时候都需要打破一个加法运算(除了编译器对行连续数的限制等等).
编辑
是否只有当整个算术运算无法适应缓存时,我才会看到减速?我认为这是不可能的 - 在这种情况发生之前,编译器可能会因为两次线路延续而感到生气.也许我明天要玩,看看.
你测量过了吗?两种方法的优化机器代码可能非常相似,如果不相同的话.
编辑:我刚试过这个,结果是我的预期:
$ gcc -O2 -S math1.c # your first approach
$ gcc -O2 -S math2.c # your second approach
$ diff -u math1.s math2.s
--- math1.s 2010-10-26 19:35:06.487021094 +0200
+++ math2.s 2010-10-26 19:35:08.918020954 +0200
@@ -1,4 +1,4 @@
- .file "math1.c"
+ .file "math2.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
Run Code Online (Sandbox Code Playgroud)
而已.相同的机器代码.
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |