我一直想知道检查数字为 1 或更大时的最佳做法是什么。
IF($foo > 0)
或者
IF($foo >= 1)
我应该使用哪一个?它们似乎都工作相同。
最终正确的是:
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
}
-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
如果您的要求是检查一个值是否大于或等于 1,那么这里甚至不需要做出决定。从逻辑和语义上来说,唯一的选择是。x >= 1
这取决于您使用的是整数还是浮点数。
根据性能优势选择一个没有什么意义。
看到 Jelmer 的说法后,我写了一个基准测试,看看是否有有意义的差异。
这是我运行的基准测试的确切代码:
<?php
echo '>= VS ><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/>>= - '.$with_equals_wins.' VS > - '.$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 得到的结果相反。
如果有任何类型的甚至稍微有意义的性能差异,那么它可能取决于代码运行的特定硬件和软件环境。
在性能方面,您希望使用>=
而不是>
.
我的伪基准:
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
甚至是20
ms!没有任何改变,显然我的处理器很忙,但很高兴与你们分享。