【问题标题】:Division by 1 in programming languages编程语言中的除以 1
【发布时间】:2015-03-20 18:50:51
【问题描述】:

那么如果我们告诉编程语言来计算这个: X/1,其中 X 是任意数字。他们实际上是计算输出还是检查/忽略 1 并返回 X?

此外,在编写类似上述代码时,是否值得检查除法器是否为 1,或者让它计算除法是否更快?

谢谢


为了详细说明这个问题:哪个更快?

$result = $number / $divisor;

$result = $divisor > 1 ? $number / $divisor : $number;

【问题讨论】:

  • 1 是 2 的幂,所以它应该被转换为右移(零),这反过来又是一个空操作。我猜。
  • 编译器/优化器会去掉它。如果它是一个运行时参数,你仍然不想检查,因为通常你很少有 1 作为除数。顺便说一句,除法通常是通过一些迭代算法完成的。使用 1 时会很快收敛。因此这不是什么大问题。
  • @sp2danny:仅当编译器知道该值时才为真。对于用户输入,您需要 JIT 才能找到它。
  • 除法通常使用 DIV CPU 指令完成,我敢打赌
  • @neuhaus:DIV DBPU 指令在内部是如何工作的......?

标签: division integer-division relational-division


【解决方案1】:

大多数编程语言可能不会检查特殊除数(0 除外)。

现在 CPU 的除法速度非常快,因此不值得事先检查。检查可能需要比实际划分更长的时间。

【讨论】:

  • 大多数编译器都会检查特殊除数,如果它可能发生在编译时
【解决方案2】:

比较示例(至少对于 PHP):

<?php
$divisor = 1;
for ($i=0; $i<100000000; $i ++ ) {
if ($divisor != 1)  
    $a = $i / $divisor;
else
    $a = $i;
}

在我的机器上使用6.9s。另一个:

<?php
$divisor = 1;
for ($i=0; $i<100000000; $i ++ ) {

    $a = $i / $divisor;
}

只接受5.2s

所以回答最后一个问题,哪个更快:让它计算除法:-)

【讨论】:

  • 你不是说if ($divisor != 1)吗?
  • 你是对的,@neuhaus。我更正了代码并修改了时间。不过不比较还是比较快的。
【解决方案3】:

由于检查和跳转 + 实际除法将是更多的 cpu 指令,而不仅仅是除法,我很确定它会完成。

如果您的代码是变量 / 1(1 是静态的),编译器很可能会将其优化掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多