我可以改进嵌入式C#上的"double.IsNaN(x)"函数调用吗?

Hba*_*bas 4 c# performance

我在for循环中调用了数百万次的代码,检查传递的参数是否是double.NaN.我描述了我的应用程序,其中一个瓶颈就是这个简单的功能:

public void DoSomething(double[] args)
{
    for(int i = 0; i < args.Length;i++)
    {
       if(double.IsNan(args[i]))
       {
         //Do something
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使我无法更改内部的代码,我可以优化它if吗?

Hba*_*bas 18

如果你真的优化了代码的其他部分,你可以让这个函数变得有点神秘,利用非数字(NaN)的定义:

"谓词x!= y是真,但所有其他,x <y,x <= y,x == y,x> = y和x> y,只要x或y或两者都是NaN,就是假."(IEEE二进制浮点运算的标准754)

将其翻译成您的代码:

public void DoSomething(double[] args)
{
    for(int i = 0; i < args.Length;i++)
    {
       double value = args[i];  
       if(value != value)
       {
         //Do something
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

在使用WindoWs CE + .NET Compact Framework 3.5的ARM设备中,获得Nan的概率约为50%,value!= value的速度是double.IsNan(value)的两倍.

确保在以后测量您的应用程序执行!