哪个运算符更快:!=还是>

9
哪个运算符更快: > 还是 ==
示例:我想测试一个值(它可以是正值或-1)是否等于-1:
if(time > -1)
// or
if (time != -1)

时间的类型是“int”


可能相关:https://dev59.com/wF7Va4cB1Zd3GeqPIEbP - Martin Ba
1
这不仅仅关乎性能,也关乎安全。如果以下代码只在非负值下安全工作,则需要使用 time > -1 - dlask
3
你可以编写一个简单的程序测试这两个运算符并比较它们的执行时间(当然要进行大量的迭代)。如果有差异,那么可能是微不足道的;我预计这两种情况都会编译成单个汇编指令。 - elnigno
1
有些处理器在与零比较时更快。因此,例如 > 0 可能比 >= 1 更快。 - Simple
1
一个好的编译器会在速度更快的情况下将 >= 1 替换为 > 0 - molbdnilo
显示剩余7条评论
3个回答

20

标准中没有明确规定。因此,取决于给定编译器在其给定版本中生成的操作码以及给定CPU执行这些操作码的速度。

也就是说,实现/平台定义。

您可以通过查看/基准测试可执行代码来了解特定的编译器/平台组合情况。

但我认为这不会有太大的差异;这是一种微观优化,几乎总是被更高级别的架构决策所抛弃。


12

这取决于平台。通常来说,这两个操作会直接转换成汇编指令“大于时跳转”和“不等时跳转”。这两者之间很可能没有性能差异,如果有的话,也是非常微小的。

唯一比其他跳转指令略快一点的跳转指令通常是“为零时跳转”/“非零时跳转”。

(在编译器较差的黑暗年代,C程序员因此喜欢将循环写成递减到零,而不是递增,以便将比较与零而不是一个值进行比较,以获得几纳秒的时间。现代编译器可以自行进行这种优化,但你偶尔还会看到这样的循环。)

总的来说,你不应该过分关注性能的微观管理。如果你花时间考虑 > 是否比 != 更快,而不是考虑程序设计、可读性和功能性,那么你需要尽快重新确定你的优先级。


3
回答不错!我只想补充一点,有时我们会从事像射线追踪这样的领域,其中性能是最重要的竞争标准之一(当然,除了正确性之外,在射线追踪器的上下文中通常没有太多棘手的副作用可以绊倒——在追求更快速美丽的图像方面,“正确性”被宽泛地定义)。即使如此,专业人士也不会问:“这个操作符比那个操作符快吗?”任何微小的优化都需要在进行分析、测量和更粗略的优化后才能进行—优先级是关键,正如前面所述。 - user4842163

6

从语义上讲,这些条件是不同的。第一个条件检查对象time是否为正数或零。

if(time > -1)

在这种情况下,最好写成:
if( time >= 0 )

然而,一些函数返回非负值或-1。例如,搜索函数在数组中未找到元素时可能返回-1。或者-1可能表示错误状态或缺少值。
在这种情况下,最好使用条件语句。
if ( time != -1 )

在编译器只生成一条机器指令以进行比较时,速度并不是你需要考虑的问题。你需要考虑哪个条件更具表现力,并显示程序员的意图。


0 不是正数,因此(假设 x 是有符号整数)x > -1 并不测试 x 是否为正数。它测试的是 x 是否为非负数 - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接