所以我知道这个问题可能非常简单,不值得问,因为差异很小,但我还是想知道。
让我们考虑三个浮动,' a'' b'和'数字'。我们想知道'数字'包含在边界的范围内' a'和' b';
'一个'和' b'是区间的限制,但它们是未分类的:' a'可能小于' b'反之亦然。
哪种功能会带来最快的结果?
1)
bool isNumberInInterval(float a, float b, float number)
{
if (a < b)
{
return ( (a <= number) && (number <= b) );
}
else
{
return ( (b <= number) && (number <= a) );
}
}
2)
bool isNumberInInterval(float a, float b, float number)
{
return ( ( (b <= number) && (number <= a) ) || ( (a <= number) && (number <= b) ) );
}
答案 0 :(得分:2)
很难说哪个更快。它取决于很多东西(数字的分布,分支预测,编译器)。你应该基准它。在我的PC上,使用GCC 6.3,具有均匀分布的[0; 1]数字,它们的速度是相同的。
这种变体在当前的PC上应该更快(它比我的PC上的变体快25%):
bool isNumberInInterval(float a, float b, float number)
{
return (a-number)*(b-number)<=0;
}
答案 1 :(得分:0)
这很可能取决于机器和编译器。但你可以说第一个更快。
第一个版本最多可执行3次比较和1次逻辑操作。但是,如果在第一个操作数为&&
时可以使false
短路,则可以执行少至2次比较和0次逻辑运算。
第二个版本的最坏情况是4次比较和3次逻辑操作。但它必须执行至少2次比较和1次逻辑操作:您不能将&&
和||
短路。