使用迭代器时的性能问题
Performance issues when using iterators?
我有一个函数,它接受一个字符列表并生成下一个字典顺序排列。为了好玩,我尝试将代码泛化以使用迭代器,并能够生成更多不同类型的排列。
template<typename ITER>
bool nextPermutation(ITER start, ITER end, std::random_access_iterator_tag)
{
for(ITER i = end-1; i != start; --i)
{
if(*(i-1) < *i)
{
// found where can be swapped
for(ITER j = end-1; j != (i-1); --j)
{
if(*(i-1) < *j)
{
// found what to swap with
auto temp = *j;
*j = *(i-1);
*(i-1) = temp;
// put everything from i on into "sorted" order by reversing
for(ITER k = end-1; k > i; --k,++i)
{
temp = *k;
*k = *i;
*i = temp;
}
return true;
}
}
}
}
return false;
}
然而,当我不使用原始指针时,我遇到了代码性能明显变慢的问题。这是我的测试设备:
template<typename ITER>
bool nextPermutation(ITER start, ITER end, std::random_access_iterator_tag);
template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}
#define USE_VECTOR
int main(void)
{
bool hasNext = true;
#ifdef USE_VECTOR
std::vector<char> c;
for(char i = '0'; i <= '9'; ++i)
{
c.push_back(i);
}
for(size_t i = 0; i < 999999 && hasNext; ++i)
{
hasNext = nextPermutation(c.begin(), c.end());
}
#else
char c[] = "0123456789";
size_t LENGTH = 10;
for(size_t i = 0; i < 999999 && hasNext; ++i)
{
hasNext = nextPermutation(c, c+LENGTH);
}
#endif
std::cout << "done" << std::endl;
std::cin.ignore();
return 0;
}
当定义USE_VECTOR
时,运行该试验台需要~20秒。当我不定义它时,代码在不到一秒的时间内运行(我没有编写任何计时代码,但这足以说明性能上存在非常显著的差异)。
现在我的问题是,在使用迭代器(std::string迭代器,std::vector迭代器等)和原始指针时,我在哪里承受了如此巨大的性能冲击?
如果没有优化,由于大量的迭代器调试(_ITERATOR_DEBUG_LEVEL
在调试模式下默认为2,即完全调试),代码在我的机器上也很慢。
然而,在/02
中,迭代器调试完全被禁用,代码在控制台窗口显示之前完全执行。这里有一个很好的调试示例,它使事情变慢但更安全。:)
在我的盒子上,这些是计时,从上面的计时,删除cin.ignore()
,并使用基准测试:
$ g++-4.6 -O4 -DUSE_VECTOR -std=gnu++0x t.cpp -o t
$ time for a in $(seq 1 1000); do ./t; done > /dev/null
0 m10.145s真实用户0 m7.204ssys 0 m1.088s
$ g++-4.6 -O4 -std=gnu++0x t.cpp -o t
$ time for a in $(seq 1 1000); do ./t; done > /dev/null
0 m7.693s真实用户0 m3.280ssys 0 m0.984s
**没有惊人的差异,如果你问我的话**
现在是重拳:
$ g++-4.6 -O0 -std=gnu++0x t.cpp -o t
$ time for a in $(seq 1 1000); do ./t; done > /dev/null
0 m29.540s真实用户0 m27.294ssys 0 m0.976s
相关文章:
- 在类中使用随机生成器时出现性能问题
- Qt OpenGL 渲染到纹理性能问题
- 剪辑性能问题
- OpenCV - 基本操作 - 性能问题 [模式:发布]
- 使用 #define 进行跟踪日志记录以避免性能问题
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- std::函数有性能问题,如何避免?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 在C 中读取大型CSV文件性能问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- C 功能性能问题
- 在C 性能问题中使用Getter返回地图
- 初始化每个班级成员时的性能问题
- 事件(开始,结束),1天的最大事件.C++ 中的性能问题
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 是包含容器性能问题的STL关联容器
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- SHGetFileInfo性能问题