【问题标题】:What's faster, an inline function call or a hashmap lookup [closed]更快的是内联函数调用或哈希图查找[关闭]
【发布时间】:2017-11-15 21:03:54
【问题描述】:

假设我有一个类ClassToSort,我需要根据valsecondVal 的值(按(val * 100) + secondVal 的升序排列)使用std::sort() 对其进行排序。

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&lt;int, long&gt; valMap 中并在排序时参考此映射,或者分别对 getVal()getSecondVal() 进行函数调用排序时的时间(这将导致函数调用的数量加倍)。以下是两个选项:

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

std::sort(objs.begin(), objs.end(),
         [](const ClassToSort* first, const ClassToSort* second) {
          return (first->getVal() * 100 + first->getSecondVal()) <
                 (second->getVal() * 100 + second->getSecondVal());
         });

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

【问题讨论】:

  • 你应该测量它并告诉我们。在性能方面,很少有“最佳解决方案”。相反,它在很大程度上取决于数据及其布局、运行的系统、正在使用的实现以及许多其他变量。
  • “什么更快?”的唯一有效答案是:测量。
  • 那些inline 声明是多余的——没有它们,函数是内联的。
  • 顺便说一句,你为什么关心?实际上,您甚至应该在问自己“什么更快?”之前进行测量
  • 您是否对您的真实案例进行了剖析并确定这部分是热点?如果没有,请编写可读的代码并让编译器进行优化

标签: c++ performance sorting data-structures


【解决方案1】:

大多数时候直接函数调用是自动内联的。

您的示例中的复杂性不是您调用 »getter« 两次,而是您进行了多次计算 - 用于与特定元素的所有比较。

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

查看these 基准。

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

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

【讨论】:

  • 感谢您的意见。我对这两种情况进行了分析,发现对于较小的输入,使用哈希表的开销很大,而且速度明显较慢。直接函数调用确实是内联的,但只是想使其明确。出于我的目的,我不希望输入的数量超过 500,所以没有哈希表可能会更好。
猜你喜欢
  • 2016-09-28
  • 2012-11-29
  • 2011-05-09
  • 2014-04-17
  • 1970-01-01
  • 2023-03-14
  • 2020-09-20
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多