if/else vs虚拟功能:设计性能



我遇到了两种获取层次结构中元素根的设计,层次结构本身就是一个派生类。出于好奇,我想知道最优雅的是否也是最高效的。这是不太优雅的版本:

class Element
{
public:
    Root* root()
    {
        if(mParent)
            return mParent->root();
        else
            return static_cast<Root*>(this);
    }
protected:
    Element* mParent;
};
class Root : public Element
{};

这里更优雅的是,它使用虚拟函数来获取根,而不是if-else。

class Element
{
public:
    virtual Root* root() { return mParent->root(); }
protected:
    Element* mParent;
};
class Root : public Element
{
public:
    virtual Root* root() { return this; }
};

我知道我不应该过早地担心性能,我已经选择了第二个选项,但我很好奇,在元素经常调用函数的情况下,是否有任何因素(缓存未命中?)会使一种方法优于另一种方法?

注意:如果我加上层次结构深度为5-20个元素的信息,我认为这个问题不会那么"宽泛"。这实际上是一个很实际的问题。

出于好奇,我想知道最优雅的是也是最有效的。

非典型。寻找一个好的设计需要时间和经验;对它进行更多的优化,它很容易失败。真的有很多话要说,但我会尽量缩小范围:

  • 需要性能吗?使用CRTP。我也看到了switch语句,但这应该是你的极值比
  • 一个好的设计?使用虚拟函数。它们非常常见(例如std::streambuf使用它们),许多语言实际上在任何地方都使用它们(接口等):是的,这是有成本的,但它不会明显影响您的代码,除非您处于需要高频率的长时间运行循环中
  • 他们两个?轮廓你需要衡量和推理电话的成本,如果太贵,你会寻找更快的方法。但是要进行个人资料,你必须有一个可以合作的基础

最新更新