什么更快,内联函数调用或hashmap查找

时间:2017-11-15 21:03:55

标签: c++ performance sorting data-structures

假设我有一个课程Message,我需要根据ClassToSortstd::sort()的值valsecondVal进行排序(按(val * 100) + secondVal的升序排列)。

class ClassToSort {
  private:
    int val;
    long int secondVal;
    int id;

  public:
    inline const int getVal() const { return val; }
    inline const long int getSecondVal() const { return secondVal; }
    inline const int getID() const { return id; }
};

std::vector<ClassToSort*> objs;

现在,我有两种方法对其进行排序,或者预先计算(val * 100) + secondVal的值并将其存储在std::unordered_map<int, long> valMap中并在排序时引用此地图,或者对{{1}进行函数调用每次排序时都会出现getVal()(这会导致函数调用次数增加一倍)。以下是两个选项:

getSecondVal()

std::sort(objs.begin(), objs.end(),
         [&](const ClassToSort* first, const ClassToSort* second) {
          return valMap[first->getID()] < valMap[second->getID()];
         });

很明显,第二个选项不仅会为每个对象调用两次getter函数,而且还会两次执行相同的计算。直觉上,我认为对于大量输入,哈希表查找会比函数调用次数更多时更快,同时重新计算。我的理解是否正确?

1 个答案:

答案 0 :(得分:0)

直接函数调用大多数时间自动内联。

您的示例中的复杂性并不是您将“getter”两次调用,而是多次执行计算 - 以便与特定元素进行所有比较。

使用unordered_map您还必须先创建哈希表。

查看these基准测试。

直接使用成员与getter函数没有区别 哈希查找的速度是每次比较计算速度的10倍 如果必须多次排序,通过将计算值(缓存)存储为一对(作为散列映射的更便宜的替代方法)来保持计算值(缓存)可能是有用的。

使用指向类而不是值的指针可能会改变性能(更差),但不应改变观察到的差异。