如何解决在 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 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 倍,但我非常不同意。如果这是可能的,那么您可以打赌,Microsoft 会在 Sqrt 调用本身中包含该优化。不仅如此,根据我的理解,调用通常是通过硬件实现的,当我测量它的时间时,我看到每个调用大约有 4-5 个滴答声。它显示了与 0 距离检查的“优化”相同的结果。这非常令人印象深刻,我不知道我是否可以做些什么来使其更快。
解决方法
像往常一样,与其尝试修复“损坏的”框架代码,不如尝试修复自己损坏的算法。因为如果有办法让 Math.Sqrt
更快,早就完成了。
特别是对于距离,您可能不需要实际计算距离,平方距离就足够了(或者再次修复您的算法以使其足够)。这意味着您可以完全放弃 Math.Sqrt
调用!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。