【发布时间】:2017-11-15 21:03:54
【问题描述】:
假设我有一个类ClassToSort,我需要根据val 和secondVal 的值(按(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<int, long> 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