检查对象是否为空 - 性能差异

时间:2014-07-10 10:03:12

标签: c# performance ants

我在使用ANTS Performance Profiler进行性能分析时,在我的应用程序中发现了一种奇怪的行为:

public void set_SelectedObject(object value)
{
    if (value == null) //65ms
    {
       //do anything
    }
}

此检查需要65毫秒,而其他检查对象是否为空则小于0,Xms。 这可能是什么原因?我认为无论传递什么值,空检查总是不变的 - 它是否取决于我的对象的大小?

2 个答案:

答案 0 :(得分:2)

这是无稽之谈。根据null检查值将始终对您的性能产​​生类似的影响。这可能需要65毫秒,因为您发送给方法的引用实际上可能是null,这会触发if语句或对位内部的逻辑 - 当对象是对象时,会触发一些重要的逻辑不是空的。

我能想象的唯一理论上的原因是你为某个类使用了一个重载的==运算符,但如果它不首先检查null,它必须是非常糟糕的代码。

答案 1 :(得分:2)

剖面仪的铸铁规则是绝对结果不准确或不重要。它们仅作为比较工具有用 - 即无论有没有改变X,我的代码更快?也就是说,65ms仍然是很大一部分时间,不应该出现在探查器差异的结果,除非探查器真的很糟糕。

我没有使用过C#ANTS探测器,如果能为你提供单行代码的时机,我会很惊讶。你确定现在不是执行if语句包围的整个块的时候吗?

如果它给你一个时间只是那一行,那意味着正在进行函数调用 - 即操作符在值类上重载。