在今天的现代处理器上,分支条件下的大于或大于或等于比较之间是否存在任何性能差异?如果我的情况同样容易,那么选择>
超过>=
或反之亦然? (这将用于英特尔或AMD硬件上的编译语言)大于或大于或等于之间是否有任何性能差异?
回答
不应该有,因为他们计算的方式比较不同的谓词之间的显着差异(注意我没有详细阅读说明书x86的,因此它可能工作不同):
大多数指令通常你至少有:carry(c),overflow(o),zero(z)和negative(n)。
使用由x-y指令创建的谓词(可靠地创建上述4),我们可以轻松地找出所有想要的比较。对于无符号数字:
x = y z
x != y !z
x < y !c
x <= y !c + z
x > y c . !z
x >= y c
所以它几乎没有任何区别。但是之后会有一些差异,如果我们可以使用TEST(这是一个AND而不是完整的相减)或不得不使用CMP(这是相减),那么这些差异大部分归结于事实。测试更有限但更快(通常)。
另外现代体系结构(从intel的c2d开始)有时可以将两个μops融合成一个宏操作 - 所谓的宏操作融合具有一些很好的优点。而且这个规则从一个架构变成了另一个架构,并且有点长。例如,仅测试溢出,奇偶校验或符号标志(JO,JNO,JP,JNP,JS,JNS)的分支可以与TEST融合,但不能与c2d和nehalems(you bet I looked that one up - section 7.5)上的CMP融合。
所以我们可以说它是复杂的,而不是担心这样的事情?这是除了如果你正在编写一个编译器的优化器,因为真的 - 独立于你在源代码中编写的东西,编译器会做它想要的 - 并且有很好的理由(例如,如果JGE理论上速度更快,写如果(x < y)通常..)。如果你真的需要一个建议:比较0通常更快。
我不太确定底层实现是如何在ALU/FPU中完成的,但是对于所有这些实现应该只有一个操作(在原始类型上即是)
我真希望这只是一个问题,因为你是好奇,而不是说你要优化,这将从未给你一个大的性能提升,最有可能你的代码将包含远远性能问题更糟糕。
你可以只使用一个事件实现所有关系运算符:
a < b is the base a > b == b < a a >= b == !(a < b) a <= b == !(a > b)
这当然它不是如何在CPU中实现,这是更琐事。
我严重怀疑是否有区别。
- 1. NHibernate [Min(x)]是否大于等于?且不大于或等于?
- 2. RenderPartial和Partial之间是否有任何大的性能差异?
- 3. 大于或小于等于
- 4. JavaScript在等于(==)和三等于(===)之间的性能差异
- 5. 最大和大于SQL之间的性能差异
- 6. 如何检查两个列表整数之间的差异是否大于或等于2?
- 7. 创建时间大于或等于
- 8. Flask-SQLAlchemy - 大于或等于
- 9. 如何检查两次之间的差异是否大于8.30?
- 10. '大于或等于'和'小于或等于'CODEIGNITER
- 11. 程序检查整数是否大于,小于或等于
- 12. 用于现有的值或大于或等于
- 13. 更好的做法:少于\大于或等于 - 或少于\大于运算符
- 14. 两张图片之间的差异是否大于图片?
- 15. 如何检查时间是否大于或小于
- 16. 双变量条件检查是否大于或等于?
- 17. 返回否或是,如果时间差大于5分
- 18. 在ggplot中注释大于或等于
- 19. 大于或等于古怪在AppleScript的
- 20. “不等于”或“大于”更快?
- 21. 包含等于或大于正确sql
- 22. Sumif日期等于或大于例外
- 23. 的Crystal Reports大于或等于参数
- 24. Jquery Datepicker ToDate大于或等于FromDate
- 25. SQL:删除大于或等于
- 26. 存储过滤器大于或等于
- 27. Django的restframework,对大于或等于2parameters
- 28. 大于或等于浮动失败
- 29. cfqueryparam日期大于或等于
- 30. 指数(从零开始)必须大于或等于零误差
我对此表示怀疑,如果有的话,它会和猫的胡须差不多。 – 2011-05-30 17:09:04