前言
今天在刷leetcode题目的时候使用STL中的sort函数,传入的不同cmp导致性能出现偏差,分析了原因之后记录一下
STL的sort函数
- STL的sort函数在头文件中
- 数据量大的时候使用Quick Sort,分段递归排序。一旦分段后的数据量小于某个门槛,为了避免Quick Sort的递归调用带来过大的额外负荷,改用Insertion Sort,递归层次过深,还会改用Heap Sort
- 使用
- sort(first, last, cmp)
- 前两个参数传入排序数组的起始和结束位置,第三个参数可选,默认升序排序
传入cmp不同导致的性能差距
1. 传入函数指针
bool cmp(T& u, T&v) {//函数逻辑}
sort(T& first, T& last, cmp);
2. 传入lambda表达式
sort(T& first, T& last, [](T&u, T&v){//函数逻辑});
3. 传入函数对象
struct cmp{
bool operator(const T& u, T& v) {
//函数逻辑
}
};
sort(T& first, T& last, cmp());
函数对象和lambda表达式速度基本一致,而函数指针比这两者慢了不少
原因是在函数对象中编译器可以实现内联调用,从而提升性能。
而对于lambda表达式,编译器实际上将lambda表达式转化为一个函数对象处理,所以使用lambda表达式和函数对象一样快
还有一点,传入参数使用引用比传入本身快,引用底层实现实际是指针,传输速度远小于对象赋值和拷贝的时间
当然如果传输数值而非对象那么可以不必如此