编程中用if(n>count )n-=count;和直接n%count 哪个更快。
假设不存在@毛草 说的语义不同的情况。要看count的值和运行的处理器微架构,假设x86。第一种会造成data dependent branch,每次branch miss会损失很多性能。不过如果n足够大,即大部分情况下condition都是false,通常分支预测正确,处理器周期是一个cmp加一个jxx的执行。另外,不知道在一些处理器上,优化成cmp加cmove会不会更快。第二种,如果count是2的幂,且常数,直接移位操作,非常快。某些特定值,也能优化。其他情况,一个整数除法操作。比较老的处理器除法是很慢的,实现是radix 4的。比较新的都是radix 16了,快不少。说了半天,其实写代码,然后vtune一下就清楚了。
■网友
好多人根本没理解题主什么意思就乱出主意了,居然还有人帖代码出来,别搞笑啦。题主用的是if,不是while,可以理解成x会不断增加,但是每次增加的量又不会超过count,严格意义第一个快。现在编译器优化了,要看 count的值,如果 count为常数 2^n,比如 256, 512之类的, 第二个直接就 \u0026amp; 255了。不确定时,写成第一种。x ++;if (x \u0026gt; 100) x -= 100;
■网友
两个不等价啊,如果n \u0026gt; count *2的时候结果不一样个人认为是后边那个快,高级语言里去写低级优化是愚蠢的行为另外如果count是2的幂的话,用bit shift最快
■网友
优化的话还是根据profiler给出的具体热点行/函数按照优先级排序再逐个针对性的优化吧。
■网友
圣意揣摩出错,原答案已删。
■网友
这完全不是一个意思 好吧 一个取余数一个比大小 完全没有意义啊 要相同意义才有比较意思啊 搞不懂题主干嘛
■网友
是不是写错了?if换成while吧!如果语义都不等价,讨论优化是完全没有意义的。优化的前提是保证结果正确,要不编译器可以把你的代码优化得快的飞起。=============好吧,如果题主表达的意思是n在0和2*count之间,就是说这两个等价的。这样的话又感觉变成了一个概率问题了,和n的分布有关了,假设n落在0到count间概率为p,count到2*count概率是1-p,在不给处理器任何分支预测的提示信息的情况下,前者是需要多执行一条jmp,后者则需要多执行一条sub指令。前一种写法的平均周期数量应该是p*周期数量(cmp+jmp)+(1-p)*周期数量(cmp+sub)。后面则相当于一条除法指令的周期。但如果后面是做连续的取余操作又会比单独的做一次快很多,因为运算器内部的硬件流水又起作用了。
推荐阅读
- 『黄金时间』请认准这个蓝色的标志! 黄金时间丨同行业中用水最少的企业
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 汽车知识|零距离体验新一季MINI COUNTRYMAN 尤加利青配黑色真香!
- 有点计算机基础的人想尽快找份编程的工作。哪种编程的工作最好找还需要学些啥
- 作为软件工程大二的学生,学习一般,编程一般,毕业后能干些啥
- 30岁的人生,想自学一门编程并从事,这个选择怎样呢
- 电子编程书可以边看边练习,价值大吗
- 自学编程知识是自己啃书加实践好还是看视频加实践好好
- 马云说的大数据时代到底是,用到啥技术,如果想要学习大数据技术,要学习哪些基础的东西要先会编程么
- 不懂技术的加班狗,怎样去学习一门技术,例如编程,如果发现培养不了这种兴趣何时该放弃,何时该继续坚持
