免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: liying_gg
打印 上一主题 下一主题

if (NULL == pLogId)和if(pLogId==NULL)有什么区别? [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
11 [报告]
发表于 2009-07-16 08:08 |只看该作者
原帖由 kouu 于 2009-7-15 22:26 发表
如果你用GCC编译的时候加了优化选项, 反汇编看到的结果可能会不一样.

说第二种for的写法更快, 其原因是:
第一种是将i与MAX比较, 每次比较需要CMP一次, 然后再判断标志位, 以便知道比较结果.
而第二种将i与0比较, CMP指令可能可以省略掉, 因为i--的时候, 如果i减为0, 标志位会自动被设置, 这时候比较i和0的话只需要直接看标志位就行了.

我用 GCC 4.3.2 测试的结果,加不加优化选项结果都是一样的。你说的这种少一条指令的情况,只会在退出条件为 i > 0 时出现,而不会在退出条件为 i >= 0 时出现。

论坛徽章:
0
12 [报告]
发表于 2009-07-16 10:21 |只看该作者

回复 #11 MMMIX 的帖子

嗯,是的,具体怎么优化还真不好说。甚至连同一个编译器的不同版本都可能有不同的做法。

我的意思是,i和0比较,提供了被优化的可能性。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2009-07-16 11:25 |只看该作者
原帖由 kouu 于 2009-7-16 10:21 发表
嗯,是的,具体怎么优化还真不好说。甚至连同一个编译器的不同版本都可能有不同的做法。

我的意思是,i和0比较,提供了被优化的可能性。

其实少一条这令这种情况绝大多数情况根本没有必要考虑进去,写代码还是应将可读性、可维护性、健壮性,等等这些放在首位。为了这么一点点几乎可以忽略的性能提升,就牺牲其他的,不是什么明智的选择。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
14 [报告]
发表于 2009-07-16 12:02 |只看该作者
原帖由 liying_gg 于 2009-7-15 17:50 发表
我公司的代码都用的前一种方式,我还以为是编译后的汇编代码会执行快呢。
for循环也不一样,一般都是for(i=0;i=0;i--),不过这个for循环据说是后一种方式编译后执行快。


呵呵,这样的代码看起来太别扭了

论坛徽章:
0
15 [报告]
发表于 2009-07-16 14:26 |只看该作者
原帖由 MMMIX 于 2009-7-16 11:25 发表

其实少一条这令这种情况绝大多数情况根本没有必要考虑进去,写代码还是应将可读性、可维护性、健壮性,等等这些放在首位。为了这么一点点几乎可以忽略的性能提升,就牺牲其他的,不是什么明智的选择。


Donald Knuth说过:premature optimization is the root of all evil,但说的是过早优化。对于设计人员来说可读性、可维护性等确认是在设计阶段首先要考虑的,但也并非如你所说的这一点点的性能提升就可以忽略不计。性能也是功能的一部分,对于有些系统而言,性能达不到要求就是功能不满足;这种时候就只能牺牲其它特性了,就时候可能就差这一点。不过一般不推荐设计时满脑子地到处写自认为是优化了性能的代码,一般是做出来之后进行实际测试,只关注一些重点的地方。当然也有些设计时就能看出来,如以前见过有人这样写:

val = strlen(str) > x? strlen(str) + 5 : strlen(str) - 3;

当然这个是我杜撰的,但我在实际产品代码中真见人一条语句里面对同一个字符串调用了7次strlen,真不知道C语言是怎么学的。

论坛徽章:
0
16 [报告]
发表于 2009-07-16 21:29 |只看该作者
原帖由 MMMIX 于 2009-7-16 11:25 发表

其实少一条这令这种情况绝大多数情况根本没有必要考虑进去,写代码还是应将可读性、可维护性、健壮性,等等这些放在首位。为了这么一点点几乎可以忽略的性能提升,就牺牲其他的,不是什么明智的选择。


确实是这样, 我也觉得把for"反着写", 没多大意义. 如果真要优化, 倒不如把for循环展开得了, 那样的话, 判断也省了, 还消除了跳转指令对处理器流水的影响.

这就好像在做小内存拷贝的时候, 如果想要高效率, 可以把src和dst两段内存当成结构体, 然后用等号赋值. 这样的话, 编译器可能会生成一段连续的MOV. (内存大小是字长的倍数, 并且小于一定值, 如128.)
而用memcpy的话, 则是通过循环, 逐字去拷贝的. 相比之下, 没有循环的要快得多~

[ 本帖最后由 kouu 于 2009-7-16 21:30 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2009-07-20 10:11 |只看该作者
天天 研究这个,中国的软件技术怪不得不长进

论坛徽章:
0
18 [报告]
发表于 2009-07-20 10:43 |只看该作者
for循环是这样的,如果是ARM的cpu的话,那么--是会高效些,因为ARM没有 一条指令就能实现自加一,ARM没有类似INC的指令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP