我总是想知道在检查数字是1还是更大时最佳做法是什么。
IF($foo > 0)
OR
IF($foo >= 1)
我应该使用哪一个?它们看起来都是一样的。
答案 0 :(得分: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
}
答案 1 :(得分: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
答案 2 :(得分:0)
如果您的要求是检查值是否大于或等于1 ,则此处甚至没有做出决定。从逻辑上和语义上讲,唯一选项为x >= 1
。
答案 3 :(得分:0)
这取决于您使用的是整数还是浮点数。
根据性能优势选择一个是没有意义的。
在看到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的英特尔i7 Sandy Bridge笔记本电脑上,我运行了几次基准测试并获得了以下结果:(我确保关闭Turbo Boost,以便CPU时钟稳定)
TOTAL WINS
>= - 26 VS > - 74
TOTAL WINS
>= - 21 VS > - 79
TOTAL WINS
>= - 22 VS > - 78
请注意,我的结果与Jelmer的结果相反。
如果存在任何甚至稍微有意义的性能差异,那么它可能取决于代码运行的特定硬件和软件环境。
答案 4 :(得分:-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
甚至20
ms这样的差异!什么都没有改变,显然我的处理器很忙,但很高兴和你们分享。