BBS.ChinaUnix.net
今日推荐    首页 | 新闻 | Linux | AIX | 博客 | 论坛 | 存储 | 人才 | 培训 | 知识库 | 资料 | 读书 | 手册 | 精华 | 下载 | 空间     
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


完成相似功能而效率不同的简单C代码
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
hzcgz
圣骑士



UID:701021
注册:2008-5-5
最后登录: 2008-07-02
帖子:120
精华:0

可用积分:120
信誉积分:0
专家积分:0 (本版)

来自:广州
状态:...离线...

[个人空间] [短信] [博客]


顶部
11楼 发表于 2008-5-5 17:53 


QUOTE:
原帖由 chzCPU 于 2008-5-5 14:08 发表


判断符号位就能明显降低效率?

应当可以忽略, 用更快的CPU 更加没有区别了
也可能一些特殊场合大量计算时有区别?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-06
帖子:1693
精华:3

可用积分:2344
信誉积分:100
专家积分:10 (本版)

来自:成都
状态:...保密...

[个人空间] [短信] [博客]


顶部
12楼 发表于 2008-5-5 19:58 
我认为LZ的论点是想当然尔



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
mandm   帅哥
侠客




UID:386340
注册:2006-3-14
最后登录: 2008-07-05
帖子:44
精华:0

可用积分:43
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
13楼 发表于 2008-5-5 20:47 
感觉有YY的嫌疑,楼主能不能把测试环境描述一下,把测试结果摆一摆呢?
1万次的数学运算就能把效率给比出来了?用的是8084的CPU不成?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
ShadowStar   帅哥
精灵王



UID:167404
注册:2004-6-27
最后登录: 2008-07-06
帖子:392
精华:3

可用积分:440
信誉积分:100
专家积分:0 (本版)

来自:沈阳 - 北京
状态:...离线...

[个人空间] [短信] [博客]


顶部
14楼 发表于 2008-5-6 09:32 
扯淡



localhost tmp # cat 11.c
#include <stdio.h>

int main()
{
        int i,x=99;
        for(i=0;i<10000;i++)
                x=(x+1)%32;
        return 0;
}



localhost tmp # cat 22.c
#include <stdio.h>

int main()
{
        unsigned int i,x=99;
        for(i=0;i<10000;i++)
                x=(x+1)%32;
        return 0;
}



localhost tmp # gcc -S 11.c
localhost tmp # gcc -S 22.c
localhost tmp # diff -Nur 11.s 22.s
--- 11.s        2008-05-06 09:28:34.000000000 +0800
+++ 22.s        2008-05-06 09:28:46.000000000 +0800
@@ -1,4 +1,4 @@
-       .file   "11.c"
+       .file   "22.c"
        .text
.globl main
        .type   main, @function
@@ -14,20 +14,14 @@
        movl    $0, -12(%ebp)
        jmp     .L2
.L3:
-       movl    -8(%ebp), %edx
-       incl    %edx
-       movl    %edx, %eax
-       sarl    $31, %eax
-       movl    %eax, %ecx
-       shrl    $27, %ecx
-       leal    (%edx,%ecx), %eax
+       movl    -8(%ebp), %eax
+       incl    %eax
        andl    $31, %eax
-       subl    %ecx, %eax
        movl    %eax, -8(%ebp)
        incl    -12(%ebp)
.L2:
        cmpl    $9999, -12(%ebp)
-       jle     .L3
+       jbe     .L3
        movl    $0, %eax
        addl    $16, %esp
        popl    %ecx
localhost tmp #



localhost tmp # gcc -O2 -S 22.c
localhost tmp # gcc -O2 -S 11.c
localhost tmp # diff -Nur 11.s 22.s
--- 11.s        2008-05-06 09:29:39.000000000 +0800
+++ 22.s        2008-05-06 09:29:34.000000000 +0800
@@ -1,4 +1,4 @@
-       .file   "11.c"
+       .file   "22.c"
        .text
        .p2align 4,,15
.globl main
localhost tmp #




您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

IPP2P-0.99.16

AMD64 3200+
ASUS nForce4 Ultra
VDATA DDR400 512MB X4
NVRaid 300GB
Geforce 6600GT
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
hzcgz
圣骑士



UID:701021
注册:2008-5-5
最后登录: 2008-07-02
帖子:120
精华:0

可用积分:120
信誉积分:0
专家积分:0 (本版)

来自:广州
状态:...离线...

[个人空间] [短信] [博客]


顶部
15楼 发表于 2008-5-6 09:58 
看来不优化时真的是unsigned int(code4) 效率高一些!
不仅仅是判断符号的问题.

顶一下LZ和ShadowStar !

gcc 为何这样分开处理?

[ 本帖最后由 hzcgz 于 2008-5-6 10:10 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-06
帖子:1693
精华:3

可用积分:2344
信誉积分:100
专家积分:10 (本版)

来自:成都
状态:...保密...

[个人空间] [短信] [博客]


顶部
16楼 发表于 2008-5-6 12:59 
我要把这个帖子顶起来。
刚才也试了试,确实有符号时会多一段代码。
但把%改成加号后,两者就相同了。
看来是因为判断了符号位的原因,大概看了看,应该是gcc用位移模仿%,对于有符号数进行了符号扩展的缘故。
但我不懂这个,希望LZ和各位精通编译器的老大讲解一下编译器对于%运算的策略,我们顺便学习一把。

此外大家不要担心这个会有什么性能损失,小弟曾优化过一段代码,通过优化将一个执行路径减少了上千条指令(该优化部分在编译内核时会执行一千多万次,执行一次节省2000左右的机器周期数),用编译一次内核作为测试,耗时16分钟,性能提高不到0.1%。所以完全不用担心少这么几行汇编引起的性能损失。

[ 本帖最后由 zx_wing 于 2008-5-6 13:04 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-05
帖子:763
精华:1

可用积分:834
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
17楼 发表于 2008-5-6 13:02 


QUOTE:
原帖由 hzcgz 于 2008-5-6 09:58 发表
看来不优化时真的是unsigned int(code4) 效率高一些!
不仅仅是判断符号的问题.

顶一下LZ和ShadowStar !

gcc 为何这样分开处理?

对unsigned int  和2的次幂的算术逻辑特点用了优化而已, 若不是2的次幂,也都一样了.



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-05
帖子:763
精华:1

可用积分:834
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
18楼 发表于 2008-5-6 13:15 


QUOTE:
原帖由 scutan 于 2008-5-4 09:41 发表
>>编译器gcc针对int 和 unisgned int 做了不同处理
能讲讲怎么不同处理的吗?这觉得这是关键.

gcc 对于2的次幂的算术逻辑特点,避免了使用divl和idivl指令. 因此针对signed 和unsigned 做了处理.
对于不是2的次幂,只好用divl 和idivl了,因此都一样了.

当然特殊优化另外一种情形了(也跟version有关系).



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-05
帖子:763
精华:1

可用积分:834
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
19楼 发表于 2008-5-6 13:21 


QUOTE:
原帖由 chzCPU 于 2008-5-5 14:08 发表


判断符号位就能明显降低效率?

说得对,判断符号位不是主要的问题(当然严格讲也是耗时)



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-05
帖子:763
精华:1

可用积分:834
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
20楼 发表于 2008-5-6 13:27 
回复 #16 zx_wing 的帖子

顶,说得对,优化是相对的! 要看具体的情况才能知道优化是否能明显变化。

[ 本帖最后由 system888net 于 2008-5-6 13:36 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.081687 second(s), 4 queries , Gzip enabled