三个函数做循环1000次执行,是分开循环快,还是一次循环快
大概代码的意思如下:
- A: (一次循环调用)
- for(i=0;i<1000;i++){
- a_func();
- b_func();
- c_func();
- }
- ---------------------------
- B: (二次循环调用)
- for(i=0;i<1000;i++){
- a_func();
- }
- for(i=0;i<1000;i++){
- b_func();
- }
- for(i=0;i<1000;i++){
- c_func();
- }
兄弟我第1反映两种操作的含义不同, 比如retry 机制,
A 表示a,b,c func 是一个序列,要么全部完成成功
B 却不同
但到底谁快,比较迷茫,
我得到的答案为B快,B 可以使用指令cache,
而A 不能
有点时间,写了个代码分析下,不要笑我无聊
现在如果假设A,B 两者意义相同的情况
测试代码如下:
- int a_func(int i)
- {
- return i;
- }
- int b_func(int i)
- {
- return i+1;
- }
- int main(void){
- int i,j,k;
- #if 1
- struct timeval tpstart,tpend;
- float timeuse;
- j=0;
- k=0;
- gettimeofday(&tpstart,NULL);
- for(i=0;i<1000;i++){
- j+=a_func(i);
- k+=b_func(i);
- }
- gettimeofday(&tpend,NULL);
- timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
- tpend.tv_usec-tpstart.tv_usec;
- timeuse/=1000000;
- printf("Used Time:%f\n",timeuse);
-
- #else
- struct timeval tpstart,tpend;
- float timeuse;
- j=0;
- k=0;
- gettimeofday(&tpstart,NULL);
- for(i=0;i<1000;i++){
- j+=a_func(i);
- }
-
- for(i=0;i<1000;i++){
- k+=b_func(i);
- }
- gettimeofday(&tpend,NULL);
- timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
- tpend.tv_usec-tpstart.tv_usec;
- timeuse/=1000000;
- printf("Used Time:%f\n",timeuse);
-
- #endif
- printf("j=%d,k=%d\n",j,k); /* j=4950,k=5050 */
- }
使用gcc 编译测试结果如下
一次循环A:
输出结果:
Used Time:0.000008
j=499500,k=500500
real 0m0.001s
user 0m0.000s
sys 0m0.001s
二次循环B:
Used Time:0.000010
j=499500,k=500500
real 0m0.001s
user 0m0.000s
sys 0m0.000s
从time 统计来看,时间差不多
而代码中计算来看好象A 更快
下面看下上面的汇编:
A:(一次循环调用)
B:(二次循环调用)
从汇编部分看:
B 中
cmp ptr [ebp-14h],3e7h
add ptr [ebp-14h] ,1
这两条被多执行了1000次
那么一共2000次
所以实际执行反而,A 更快
找了块arm11 的板执行上面代码
A:(一次循环调用)
B:(二次循环调用)
看来也是A 快
arm 的汇编,也差不多,只是i=0 会单独执行下
然后执行 也是cmp 指令循环 999次
A:(一次循环调用)
B:(二次循环调用)
比如arm gcc 中对循环总是先做1次,然后再循环,不论改为while ,goto 反汇编的代码都是这样
所以如果到了一两条指令都要计较的的时候,要快,那么可以自己根据循环代码反汇编来自己写汇编优化
将机器编译的代码中冗余部分去掉,毕竟是编译器要考虑的东西太多
无聊的分析下,如果无聊可以无聊的看下
阅读(1759) | 评论(0) | 转发(0) |