0

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

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

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

4

2 回答 2

2

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

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

于 2014-07-10T10:05:16.960 回答
2

剖析器的铁定规则是绝对结果不准确或不重要。它们仅用作比较工具 - 即我的代码在更改 X 或不更改 X 的情况下是否更快?也就是说,65ms 仍然是一个相当大的时间段,不应该因为探查器的差异而出现,除非探查器真的很糟糕。

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

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

于 2014-07-10T10:09:22.813 回答