2014-07-10 77 views
0

我只是在我的应用程序发现了一个怪异的行为,而这样做有蚂蚁性能探查器性能分析:检查对象为空 - 性能差异

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

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

+0

它不应该。我认为要么这不是你的实际代码,要么你误解了剖析器的结果。你确定它不是执行65ms的*整个*方法吗? – dcastro

+0

命中次数是多少?可能是一个庞大的数字? –

+0

感谢您的回答。我放出的是事实,这个方法是由Reflector“生成”的。该类是DevExpress中的一个Grid。可能是反射器没有捕获PropertyChangedEvent或其他的依赖关系?命中次数是4,但我已经通过这个值分割了时间(实际上它总共是258ms) – Frame91

回答

2

轮廓仪的铸铁规则是绝对结果不准确或不重要。它们仅用作比较工具 - 即我的代码更快更改或不更改X?也就是说,65ms仍然是一个很大的时间段,除非分析器非常糟糕,否则不应该出现分析器变化的结果。

我还没有使用C#ANTS分析器,如果它给了你这样一行代码的时间,我会感到惊讶。你确定现在不是执行if语句所包围的整个块的时候吗?

如果它为您提供了一段时间,那意味着正在进行函数调用 - 即值类上的运算符超载。

+0

你是对的,时间显示在equasion的行,但我想这是显示整个if-else语句的时间...... – Frame91

2

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

我可以想象的唯一理论原因是你为一些类使用了一个重载的==操作符,但是如果它不首先检查null,它必须是非常差的一段代码。

+0

其实我的方法是由Reflector“生成”的。原始方法是DevExpress-XtraVerticalGrid中的“Set_Selected_Object”。我想他们发射一个事件,如果该值设置... – Frame91

+3

你的理论原因是不正确的。 '=='操作符不能为'System.Object'重载。 –

+0

@SriramSakthivel你说得对。操作符必须是一个虚拟方法,显然不会以这种方式实现,因为它是静态的。 – Tarec