繁体   English   中英

"a<=b" 和 "(a

[英]What is the performance difference between "a<=b" and "(a<b) OR (a==b)"?

a<=b的性能也与a<b相似,或者是两次。 考虑这三种情况:

     for (int i =0; i <= 10; i++) {
      // Some operations here
      }
     for (int i =0; (i < 10) OR (i == 10); i++) {
      // Some operations here
      }
     for (int i =0; i <10; i++) {
      // Some operations here
     }

你会如何比较这三个?

这取决于编程语言、硬件和编译器,但是,如果您对无法优化此语句的常见 x86 CPU 和编译器进行 C++ 处理,则区别在于汇编代码生成。

在汇编程序级别,比较是通过进一步的标志检查进行减法。 a <= b可能会变成这样:

cmp eax, ebx
jle a_le_b

我们假设变量已经在寄存器中以简化示例。 你看,我们只需要 2 条指令。

(a<b) | (a==b) (a<b) | (a==b)字面意思是:

cmp eax, ebx
jl a_le_b
cmp eax, ebx
je a_le_b

同样,在这里我将 C++ 翻译成汇编程序,没有任何优化,只是“原样”。 如果编译器启用了优化,它很可能会为两个语句生成相同的代码。

现在,在 C++ 中,运算符可能会被重载。 这意味着<= (理论上)可以执行<=不同成本的完全不同的操作。 然而,在实践中通常<=实现方式与调用<后调用==完全一样,反之亦然。

结论:在实践中,对于通用处理器类型上的优化编译器和调用比较运算符的语义正确的类,您不会有任何可观察到的差异。 然而,这两个语句的语义并不完全相同,因此理论上甚至有可能a <= ba < b | a == b给出不同的结果a < b | a == b a < b | a == b

从字面上看你的问题,两者的答案都是O(1)

但假设您对执行时间更感兴趣,答案取决于代码是否被解释或编译。 任何现代编译器都会将它们优化为相同的代码。 解释器将花费两倍的时间来检查等于和大于情况,因为第一个测试将失败,它需要测试第二个。

复杂性通常用大 O 符号表示。 即使第二种情况是O(2) (编译器可能不同意),那么复杂性仍然相同,因为O(2)O(1)完全相同。

一个是否需要两倍于另一个与复杂性无关,它们都具有恒定的复杂性,因为独立于ab的值,它们进行固定数量的操作。

如果您担心性能,请注意编译器知道哪些表达式是等效的,并且选择最便宜的表达式可能比人类更好。

a<=b ”和“ (a<b) OR (a==b) ”之间的时间复杂度差异是什么?

复杂性分析适用于算法。 关系比较不是算法,因此无法分析其复杂性。 我们只能分析用于实现这种比较的算法。 可以使用什么算法取决于比较的类型。 答案还取决于我们是否考虑最坏、最好或平均情况。

<=通常可以实现为(a<b) OR (a==b) 在这种情况下, <=的复杂性不会比(a<b) OR (a==b)的复杂性更糟糕,除非它的实现是次优的。 <=的复杂度通常a<ba==b的更差的复杂度相同。 大多数情况下,所有这三个都具有相同的渐近复杂性。 但这取决于比较对象的类型。


 int i =0; (i < 10) OR (i == 10) int i =0; i <= 10

这些比较的渐进复杂性完全相同:它是恒定的。 事实上, int的大小对于任何系统都是恒定的,因此没有可以增长的输入,因此渐近分析将毫无意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM