在sqrt之前添加距离条件是否是该代码的性能增益



让我提出一个假设性问题。给定这两块C#代码,第二个版本会更快吗?我已经对这一点进行了大量的研究和测试/计时,我有自己的理论(我现在将对此保密,以免影响答案(,但我想在这里提出这个问题,以控制我自己的偏见。我之所以研究这个问题,是因为最近在一次采访中有人问我这个问题,我对结果的讨论方式不满意。提前谢谢。

第一个版本:

public float DistanceBetweenPoints(float x1, float y1, float x2, float y2)
{
float result;
float xDifference = Math.Abs(x1 - x2);
float yDifference = Math.Abs(y1 - y2);
result = (float) Math.Sqrt(xDifference * xDifference + yDifference * yDifference);
return result;
}

第二个版本:

public float DistanceBetweenPoints(float x1, float y1, float x2, float y2)
{
float result;
float xDifference = Math.Abs(x1 - x2);
float yDifference = Math.Abs(y1 - y2);
if(xDifference > 0 || yDifference > 0)
{
result = (float) Math.Sqrt(xDifference * xDifference + yDifference * yDifference);
}
else
{
result = 0;
}
return result;
}

我特别想知道添加0距离检查是否是一种优化。在这一点上,我将围绕这个问题给出更多的上下文。第一个版本是我提交的解决方案,第二个版本是面试官坚持要求我做的,以提高代码的性能。他们声称第二个版本比原来快20倍,但我完全不同意。如果这是可能的,那么你可以打赌微软会在Sqrt调用本身中包含该优化。不仅如此,据我所知,呼叫通常是通过硬件实现的,当我测量它的时间时,我看到每个呼叫大约有4-5次滴答声。它显示了与";优化";0距离检查的。这太令人印象深刻了,我不知道我能不能做些什么让它更快。

像往常一样,而不是试图修复"破碎的";框架代码,您应该尝试修复自己损坏的算法。因为如果有一种方法可以让Math.Sqrt更快,那就已经实现了。

特别是对于距离,你可能不需要实际计算距离,距离的平方就足够了(或者,修正你的算法使其足够(。这意味着您可以完全放弃Math.Sqrt呼叫!

最新更新