我在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)的两倍.
确保在以后测量您的应用程序执行!