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

本文关键字:性能 对象 是否 检查 | 更新日期: 2023-09-27 18:12:29

在使用ANTS性能分析器进行性能分析时,我刚刚发现应用程序中有一个奇怪的行为:

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

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

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

对于分析器来说,绝对的结果是不准确或不重要的。它们只作为一个比较工具有用——也就是说,我的代码在做了X修改后还是没有做X修改后更快?也就是说,65ms仍然是一段相当长的时间,不应该因为分析器的差异而出现,除非分析器真的很糟糕。

我没有使用过c# ANTS分析器,如果它能给你这样的一行代码计时,我会很惊讶的。你确定现在不是执行if语句包围的整个代码块的时候吗?

如果它只给出了那一行的时间,这意味着正在进行函数调用-即对值类进行操作符重载。

胡说八道。检查值是否为null总是会对性能产生类似的影响。它可能需要65毫秒,因为你发送给方法的引用可能实际上是一个null,这会触发你的if语句中的逻辑,或者相反-当对象不是null时,会触发一些沉重的逻辑。

我能想到的唯一理论上的原因是您对某些类使用了重载==操作符,但如果它不首先检查null,那么它将是一段非常糟糕的代码。