Math.Floor或Math.Truncate vs(int)在正数的性能方面

时间:2014-08-21 11:11:58

标签: c# .net performance math type-conversion

我是否正确地假设这种情况:

double d = 3.76212; // d >= 0 && d <= Int32.MaxValue

应该总是使用它:

double truncated = (double)(int)d;

而不是其中任何一个:

double truncated = Math.Truncate(d); // 4 times slower than (double)(int) on x86, 7 times slower than (double)(int) on x64
double truncated = Math.Floor(d); // 3 times slower than (double)(int) on both x86 and x64

换句话说,只有在处理足够大的数字(&gt; x86上的Int32.MaxValue和&gt; Int64.MaxValue onx64)时,或者处理数字时,才会使用Math.Floor。 0因为Floor的行为与负数不同?至于Truncate,它的使用应该是有限的(没有真正适合Int32或Int64的大负数),因为它在所有情况下都比Floor慢?

1 个答案:

答案 0 :(得分:0)

我认为在框架的未来版本或CLR的未来版本中,我们不能认为这将永远如此。

您可以做的是创建一个您调用的简单帮助程序类,并隐藏该类中的实现细节。然后,当出现新的CLR / Framework时,您可以重新进行测量并在需要时更新帮助程序类:

double truncated = FastMath.Truncate(d);

并按照

的方式实施
public static double Truncate(double d)
{
    if ((d >= Int32.MinValue) && (d <= Int32.MaxValue))
    {
        ...
    }
}