只是为了进一步重申重要的性能测试如何我跑在Windows 7与2010年靶向.NET 4.0 VS编译64位本地和32位模式下我的核心i5-750下面的测试,得到了以下结果:
public static bool DoSomething(double[] args) {
bool ret = false;
for (int i = 0; i < args.Length; i++) {
if (double.IsNaN(args[i])) {
ret = !ret;
}
}
return ret;
}
public static bool DoSomething2(double[] args) {
bool ret = false;
for (int i = 0; i < args.Length; i++) {
if (args[i] != args[i]) {
ret = !ret;
}
}
return ret;
}
public static IEnumerable<R> Generate<R>(Func<R> func, int num) {
for (int i = 0; i < num; i++) {
yield return func();
}
}
static void Main(string[] args) {
Random r = new Random();
double[] data = Generate(() => {
var res = r.NextDouble();
return res < 0.5 ? res : Double.NaN;
}, 1000000).ToArray();
Stopwatch sw = new Stopwatch();
sw.Start();
DoSomething(data);
Console.WriteLine(sw.ElapsedTicks);
sw.Reset();
sw.Start();
DoSomething2(data);
Console.WriteLine(sw.ElapsedTicks);
Console.ReadKey();
}
在86模式(释放,天然地):
DoSomething() = 139544
DoSomething2() = 137924
在x64的模式:
DoSomething() = 19417
DoSomething2() = 17448
但是,如果我们的NaN
的分布更稀疏,会发生一些有趣的事情。如果我们改变我们的0.5
常数0.9
(只有10%NaN的),我们得到:
86:
DoSomething() = 31483
DoSomething2() = 31731
64:
DoSomething() = 31432
DoSomething2() = 31513
重新排序的电话显示了相同的趋势,以及。食物的思想。
double.isNan实际上是一个小函数......所以,正如你所指出的,有一个开销叫它。 – Hbas 2010-07-20 02:35:47
在公共中间语言(CIL)它有7行的代码: L_0000:ldarg.0 L_0001:ldarg.0 L_0002:beq.s L_0006 L_0004:ldc.i4.1 L_0005:滞留 L_0006 :ldc.i4.0 L_0007:ret – Hbas 2010-07-20 02:48:14