首页 > 解决方案 > 在 null 与 null 对象性能上的分支

问题描述

哪个最有效:使用 null 对象,或 nullptr 上的分支。C++ 中的示例:

void (*callback)() = [](){}; // Could be a class member

void doDoStuff()
    {
    // Some code
    callback();  // Always OK. Defaults to nop
    // More code
    }

对比

void (*callback)() = nullptr; // Could be a class member

void doDoStuff()
    {
    // Some code
    if(callback != nullptr)  // Check if we should do something or not
        {callback();}
    // More code
    }

假设编译器无法内联它,null 对象将始终执行间接函数调用。使用nullptr,总会​​做分支,如果有事要做,也会做间接函数调用。

用指向抽象基类的指针替换回调会影响决策吗?

callback设置为 nullptr 以外的东西的可能性如何。我猜如果callback最有可能是nullptr,那么使用附加分支会更快,对吧?

标签: c++dispatchbranch-predictionnull-object-pattern

解决方案


这些问题都不能先验地回答。它们将取决于无数因素,包括但不限于硬件的细节、调用时缓存的细节、围绕此类调用的各种代码(可能隐藏任何引入的延迟)、编译器的内联/去虚拟化能力(这又取决于所有代码的具体细节)等等。

仅当您拥有要优化的确切代码,并且确定所讨论的代码是值得进行此类优化的性能问题时,才应尝试此类微优化。


推荐阅读