假设我有一个课程Message
,我需要根据ClassToSort
和std::sort()
的值val
对secondVal
进行排序(按(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函数,而且还会两次执行相同的计算。直觉上,我认为对于大量输入,哈希表查找会比函数调用次数更多时更快,同时重新计算。我的理解是否正确?
答案 0 :(得分:0)
直接函数调用大多数时间自动内联。
您的示例中的复杂性并不是您将“getter”两次调用,而是多次执行计算 - 以便与特定元素进行所有比较。
使用unordered_map
您还必须先创建哈希表。
查看these基准测试。
直接使用成员与getter函数没有区别 哈希查找的速度是每次比较计算速度的10倍 如果必须多次排序,通过将计算值(缓存)存储为一对(作为散列映射的更便宜的替代方法)来保持计算值(缓存)可能是有用的。
使用指向类而不是值的指针可能会改变性能(更差),但不应改变观察到的差异。