Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在sqrt之前添加距离条件是否是此代码的性能增益?_C#_Performance_Optimization_Distance_Sqrt - Fatal编程技术网

C# 在sqrt之前添加距离条件是否是此代码的性能增益?

C# 在sqrt之前添加距离条件是否是此代码的性能增益?,c#,performance,optimization,distance,sqrt,C#,Performance,Optimization,Distance,Sqrt,让我提出一个假设性问题。考虑到这两块C代码,第二个版本会更快吗?我已经对此进行了大量的研究和测试/计时,我有自己的理论(为了不影响答案,我将暂时保留自己的理论),但我想在这里提出这个问题,以抑制我自己的偏见。我之所以研究这个问题,是因为最近有人在采访中问了这个问题,我对结果的讨论方式不满意。先谢谢你 第一版: public float DistanceBetweenPoints(float x1, float y1, float x2, float y2) { float result;

让我提出一个假设性问题。考虑到这两块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
调用

第二个版本比较慢。您希望
xDifference
yddifference
都为零的频率是多少?我想澄清一下我的问题(我马上编辑它)。我不是在寻找sqrt调用的最快实现,我想知道在sqrt周围添加零距离的条件是否会提高性能。这取决于Math.sqrt是否在内部实现检查本身。ILSpy没有反编译代码,所以我们无法判断。“可能”的是,不同的框架版本的实现可能有所不同。我使用了Stopwatch类,滚动平均为100帧,我运行了大约30秒的程序以获得错误扩散。以下是我所看到的:原始解决方案距离>0:4.0次呼叫次数(+0.3次呼叫在程序生命周期内)距离=0:3.7次呼叫次数(+0.5次呼叫在程序生命周期内)“优化”解决方案距离>0:4.2次呼叫次数(+0.4次呼叫在程序生命周期内)Distance=0:4.0 ticks per call(+-0.2 ticks per call For the life of the program)为了优化,
Math.Abs
是不必要的。这个问题专门针对距离提出的,所以很遗憾,我不能忽略它。但你肯定有一个很好的观点。通常,平方距离就足够了,我相信很多游戏引擎,比如Unity,都有专门的计算方法。