从http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.html和http://www.geeksforgeeks.org/c-qsort-vs-c-sort/,我们发现使用STL的排序机制比C&#qsort()更快。
这是因为比较功能是"内联"。但是,当使用https://godbolt.org/处的编译器资源管理器来检查gcc编译器的输出时,我无法让任何运算符实际变为内联。有关示例,请参阅here,代码如下:
#include <string>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <iostream>
using namespace std;
class myClass {
public:
int key;
int data;
myClass(int k, int d) : key(k), data(d) {}
inline bool operator<(myClass& other) {
return key < other.key;
}
};
main () {
myClass c1(1,100), c2(2, 100);
if (c1 < c2) cout << "True" << endl;
else cout << "False" << endl;
}
生成的汇编代码清楚地调用了operator<
例程。 C ++编译器完全忽略了inline
关键字!
那么,当 运算符内联时?例如,这是获得更快排序性能的关键,但知道如何尽可能利用它会很好。
答案 0 :(得分:4)
默认情况下,大多数编译器都不会内联任何内容,因为这会妨碍调试。您需要启用优化。
gcc有一些levels of optimizations和许多可单独调整的优化设置,但即使是最简单的"-O1" flag is enough也可以让您的示例内联toy_attributes = Toy.new.attributes.keys.select do |key|
key != 'created_at' && key != 'updated_at'
end
params = toy_attributes.reduce({}) do |params, attr|
params[attr] = true; params
end
toys = params.flat_map do |attribute, value|
child.toys.where({attribute => value})
end
函数。 (事实上,gcc实际上意识到它可以在编译时确定operator<
的结果,并且能够完全丢弃operator<
分支!)