标题:随便写一段代码 论证一下简单代码的优化(用宏有什么收获?)
只看楼主
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
 问题点数:0 回复次数:6 
随便写一段代码 论证一下简单代码的优化(用宏有什么收获?)
程序代码:
#include <stdio.h>

int inc(int a)
{
    return (a+1);
}

int main(void)
{
    int x = 521;
    int i = 0;
    printf("%d\n", x);
   
    for  (i = 0; i < 1314000; i++)
    {
        x = inc(x);
    }
   
    printf("%d\n", x);
   
    return 0;
}


gcc -Wall a.c

Compilation finished at Sat Jan 19 13:46:01

程序代码:
0x004013c7 <main+14>:              mov    DWORD PTR [esp+0x1c],0x209
0x004013cf <main+22>:              mov    DWORD PTR [esp+0x18],0x0
0x004013d7 <main+30>:              mov    eax,DWORD PTR [esp+0x1c]
0x004013db <main+34>:              mov    DWORD PTR [esp+0x4],eax
0x004013df <main+38>:              mov    DWORD PTR [esp],0x403064
0x004013e6 <main+45>:              call   0x401c50 <printf>
0x004013eb <main+50>:              mov    DWORD PTR [esp+0x18],0x0
0x004013f3 <main+58>:              jmp    0x401409 <main+80>
0x004013f5 <main+60>:              mov    eax,DWORD PTR [esp+0x1c]
0x004013f9 <main+64>:              mov    DWORD PTR [esp],eax
0x004013fc <main+67>:              call   0x4013b0 <inc>
0x00401401 <main+72>:              mov    DWORD PTR [esp+0x1c],eax
0x00401405 <main+76>:              inc    DWORD PTR [esp+0x18]
0x00401409 <main+80>:              cmp    DWORD PTR [esp+0x18],0x140ccf
0x00401411 <main+88>:              jle    0x4013f5 <main+60>
0x00401413 <main+90>:              mov    eax,DWORD PTR [esp+0x1c]
0x00401417 <main+94>:              mov    DWORD PTR [esp+0x4],eax
0x0040141b <main+98>:              mov    DWORD PTR [esp],0x403064
0x00401422 <main+105>:             call   0x401c50 <printf>


gcc -Wall a.c -O2

Compilation finished at Sat Jan 19 13:52:30

循环啦 函数调用啦 全部优化掉了 最终的结果就是两个输出 请问 这里如果换成宏 能有什么收获?
程序代码:
0x00401c86 <main+14>:                mov    DWORD PTR [esp+0x4],0x209
0x00401c8e <main+22>:                mov    DWORD PTR [esp],0x403064
0x00401c95 <main+29>:                call   0x401be0 <printf>
0x00401c9a <main+34>:                mov    DWORD PTR [esp+0x4],0x140ed9
0x00401ca2 <main+42>:                mov    DWORD PTR [esp],0x403064
0x00401ca9 <main+49>:                call   0x401be0 <printf>

结论
1 gcc对于这种代码的优化是【杀鸡焉用牛刀】
2 用函数调用在开编译优化的情况下没有性能损失
3 gcc真是好东西啊


[ 本帖最后由 zklhp 于 2013-1-19 13:57 编辑 ]
搜索更多相关主题的帖子: 优化 
2013-01-19 13:54
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
不知所云

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-01-19 15:54
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
得分:0 
同意楼上  两只黄鹂鸣翠柳........

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-19 16:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
一群水鸭上论坛

授人以渔,不授人以鱼。
2013-01-19 16:05
jokerbat
Rank: 2
等 级:论坛游民
帖 子:77
专家分:91
注 册:2012-2-1
得分:0 
老大怎么把头相给换了、

#include <stdio.h>
int inc(int);
int inc(int a)
{
    return (a+1);
}

int main(void)
{
    int x=521;
    int i=0;
    printf("%d\n",x);
   
    for  (i=0;i<1314000;i++)
    {
        x=inc(x);
    }
   
    printf("%d\n", x);
    return 0;
}
2013-01-21 12:22
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:0 
把循环优化成了:mov DWORD PTR [esp+0x4],0x140ed9
不过Z版,你的宏在哪?

My life is brilliant
2013-01-21 12:36
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
以下是引用zklhp在2013-1-19 13:54:49的发言:


#include <stdio.h>

int inc(int a)
{
    return (a+1);
}

int main(void)
{
    int x = 521;
    int i = 0;
    printf("%d\n", x);
   
    for  (i = 0; i < 1314000; i++)
    {
        x = inc(x);
    }
   
    printf("%d\n", x);
   
    return 0;
}


gcc -Wall a.c

Compilation finished at Sat Jan 19 13:46:01


0x004013c7 <main+14>:              mov    DWORD PTR [esp+0x1c],0x209
0x004013cf <main+22>:              mov    DWORD PTR [esp+0x18],0x0
0x004013d7 <main+30>:              mov    eax,DWORD PTR [esp+0x1c]
0x004013db <main+34>:              mov    DWORD PTR [esp+0x4],eax
0x004013df <main+38>:              mov    DWORD PTR [esp],0x403064
0x004013e6 <main+45>:              call   0x401c50 <printf>
0x004013eb <main+50>:              mov    DWORD PTR [esp+0x18],0x0
0x004013f3 <main+58>:              jmp    0x401409 <main+80>
0x004013f5 <main+60>:              mov    eax,DWORD PTR [esp+0x1c]
0x004013f9 <main+64>:              mov    DWORD PTR [esp],eax
0x004013fc <main+67>:              call   0x4013b0 <inc>
0x00401401 <main+72>:              mov    DWORD PTR [esp+0x1c],eax
0x00401405 <main+76>:              inc    DWORD PTR [esp+0x18]
0x00401409 <main+80>:              cmp    DWORD PTR [esp+0x18],0x140ccf
0x00401411 <main+88>:              jle    0x4013f5 <main+60>
0x00401413 <main+90>:              mov    eax,DWORD PTR [esp+0x1c]
0x00401417 <main+94>:              mov    DWORD PTR [esp+0x4],eax
0x0040141b <main+98>:              mov    DWORD PTR [esp],0x403064
0x00401422 <main+105>:             call   0x401c50 <printf>


gcc -Wall a.c -O2

Compilation finished at Sat Jan 19 13:52:30

循环啦 函数调用啦 全部优化掉了 最终的结果就是两个输出 请问 这里如果换成宏 能有什么收获?

0x00401c86 <main+14>:                mov    DWORD PTR [esp+0x4],0x209
0x00401c8e <main+22>:                mov    DWORD PTR [esp],0x403064
0x00401c95 <main+29>:                call   0x401be0 <printf>
0x00401c9a <main+34>:                mov    DWORD PTR [esp+0x4],0x140ed9
0x00401ca2 <main+42>:                mov    DWORD PTR [esp],0x403064
0x00401ca9 <main+49>:                call   0x401be0 <printf>

结论
1 gcc对于这种代码的优化是【杀鸡焉用牛刀】
2 用函数调用在开编译优化的情况下没有性能损失
3 gcc真是好东西啊


这个是常识了。
你可以看看gcc对递归的优化。
2013-01-22 11:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-397077-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.089808 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved