2

我一直想知道检查数字为 1 或更大时的最佳做法是什么。

IF($foo > 0)

或者

IF($foo >= 1)

我应该使用哪一个?它们似乎都工作相同。

4

5 回答 5

3

最终正确的是:

if ($foo >= 1) { }

它清晰、简洁,适用于你扔给它的任何数字类型(所有两个)。

以下是仅整数比较的一些替代方案;顺便说一句,它们都没有产生更好的性能(事实)或可读性(在我看来)。

if ($foo) { 
    // anything that's not zero, regardless of sign
}

if ($foo != 0) {
    // same as above, but forces the left operand to be casted to number
}

if ($foo > 0) {
    // anything that's above zero and therefore greater or equal to one
}
于 2012-11-23T15:22:48.443 回答
3
                     -1      0       0.5      1
IF($foo > 0)         false   false   true     true
IF($foo >= 1)        false   false   false    true
IF($foo)             true    false   true     true
于 2012-11-23T15:29:42.377 回答
0

如果您的要求是检查一个值是否大于或等于 1,那么这里甚至不需要做出决定。从逻辑和语义上来说,唯一的选择是。x >= 1

于 2012-11-23T15:29:38.773 回答
0

这取决于您使用的是整数还是浮点数。

根据性能优势选择一个没有什么意义。

看到 Jelmer 的说法后,我写了一个基准测试,看看是否有有意义的差异。

这是我运行的基准测试的确切代码:

<?php

echo '&gt;= VS &gt;<br/>';

for($j = 0; $j < 100; $j++)
{

    $start = microtime(true);

    for($i = 1000000; $i > 0; $i--)
    {

    }

    $midpoint = microtime(true);

    for($i = 1000000; $i >= 1; $i--)
    {

    }

    $end = microtime(true);

    $with_equals = $end - $midpoint;
    $no_equals = $midpoint - $start;

    echo $with_equals.' VS '.$no_equals.'<br/>';

    if($with_equals < $no_equals)
    {
        $with_equals_wins++;
    }
    elseif($with_equals > $no_equals)
    {
        $no_equals_wins++;
    }

}

echo '<br/>TOTAL WINS<br/>&gt;= - '.$with_equals_wins.' VS &gt; - '.$no_equals_wins;

在我运行 Windows 7 x64 和 XAMPP 1.7.3 的 Intel i7 Sandy Bridge 笔记本电脑上,我运行了几次基准测试并得到以下结果:(我确保关闭 Turbo Boost 以使 CPU 时钟稳定)

TOTAL WINS
>= - 26 VS > - 74

TOTAL WINS
>= - 21 VS > - 79

TOTAL WINS
>= - 22 VS > - 78

请注意,我的结果与 Jelmer 得到的结果相反。

如果有任何类型的甚至稍微有意义的性能差异,那么它可能取决于代码运行的特定硬件和软件环境。

于 2012-11-23T23:45:49.027 回答
-1

在性能方面,您希望使用>=而不是>.

我的伪基准:

for 100000x {
    time result of 5 > 0
}

for 100000x {
    time result of 5 >= 1
}

编辑:正如威廉在评论中建议为整个 for 循环计时,这正是发生的事情。我把所有的时间加在一起,这给了我与一次计时整个 for 循环完全相同的结果。所以基本上我也是这么做的。(仅供参考。我以威廉的建议为基准,结果相同。相信我,我是一名工程师)

我的结果:

          >                 >=
x100000 | 198.63224029541 | 191.68829917908
In MS

因此,当谈到速度并且您使用整数时(请参阅上面的精彩答案!),>=会更快。但是,考虑后果!这只是7ms通过100.000测试。但是,当您有几百万条记录要检查时...

编辑

在多次运行基准测试后,我得到了更大的差异。差异之类10的,15甚至是20ms!没有任何改变,显然我的处理器很忙,但很高兴与你们分享。

于 2012-11-23T16:11:55.970 回答