【发布时间】:2014-02-05 07:21:10
【问题描述】:
为什么std::rotate 比 cplusplus.com 描述的等效函数快这么多?
cplusplus.com 的实现:
template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last)
{
ForwardIterator next= middle;
while (first != next)
{
swap (*first++, *next++);
if(next == last)
next= middle;
else if (first==middle)
middle= next;
}
}
我有两种完全相同的插入排序算法,除了一种使用std::rotate,一种使用cplusplus.com的等效函数。我将它们设置为使用 1000 个 int 元素对 1000 个向量进行排序。使用std::rotate的排序耗时0.376秒,另一个耗时8.181秒。
这是为什么?我不打算尝试制作比 STL 函数更好的东西,但我仍然很好奇。
【问题讨论】:
-
许多可能的原因:
std::rotate是使用特定于架构的程序集实现的,或者您可能只是没有使用优化标志进行编译 -
这在很大程度上取决于您的标准库实现。你看过
std::rotate的来源吗? -
你使用什么编译器,什么优化级别?
-
看看你的编译器的实现——g++有很多不同的选择算法
-
制作一个自定义的
std::swap实现并记录它被调用的次数。
标签: c++ algorithm sorting c++11 stl