stl中的for_each性能测试及为何性能如此之高
测试代码如下,VS2005 RELEASE版测试,结果:
for_each & 函数对象: 4977
for_each & 函数指针: 4883
for遍历: 17394
index遍历: 8736
测试结果让我很诧异,同样使用了inline的情况下怎么会性能差这么多,我为了避免重新申请内存及a.begin()这样的性能消耗甚至都把这些保存在一个变量里了,但还是差这么多,甚至用index访问都会慢那么多。
有高手可以大约讲解下吗?多谢~
- C/C++ code
template <class T>void inline print_item_global(T &item){ if (item == 3) item = 4;}template <class T>class func_obj{public: struct print_item { template <class T> void inline operator()(T &item) { if (item == 3) item = 4; } }; void test_for_each() { std::vector<int> a; for (int i = 0; i < 190000; ++i) a.push_back(i); // std::for_each(a.begin(), a.end(), print_item_global<T>); int n_start = GetTickCount(); for (int i = 0; i < 20000; ++i) std::for_each(a.begin(), a.end(), print_item()); printf("elpase 1: %d\n", GetTickCount() - n_start); n_start = GetTickCount(); for (int i = 0; i < 20000; ++i) std::for_each(a.begin(), a.end(), print_item_global<T>); printf("elpase 2: %d\n", GetTickCount() - n_start); std::vector<int>::iterator iter; std::vector<int>::iterator iter_start = a.begin(); std::vector<int>::iterator iter_end = a.end(); n_start = GetTickCount(); for (int i = 0; i < 20000; ++i) for (iter = iter_start; iter != iter_end; ++iter) print_item_global(*iter);// std::for_each(a.begin(), a.end(), print_item_global<T>); printf("elpase 3: %d\n", GetTickCount() - n_start); n_start = GetTickCount(); for (int i = 0; i < 20000; ++i) for (int j = 0; j < 190000; ++j) print_item_global(a[j]); // std::for_each(a.begin(), a.end(), print_item_global<T>); printf("elpase 4: %d\n", GetTickCount() - n_start); system("pause"); }};
[解决办法]
因为据说在C#下早就是for_each效率高了,因为编译器对for_each能更好地、更有把握地进行优化。
[解决办法]
- C/C++ code
for (int i = 0; i < 20000; ++i) { int* pn = &a[0]; for (int j = 0; j < 190000; ++j) { print_item_global(*pn); pn++; } }
[解决办法]
其实release版本下效率都差不多,
可能debug版本foreach时去掉了些调试信息
[解决办法]
[解决办法]
是这样的,vector的迭代器可能有多余的开销造成了这种差别。
在一些实现中,在release时,for_each();
以及大部分算法都会先获得迭代器的最优化版本(vector中应该是纯指针)。
将你的for循环换成指针,将会得到一样的结果,但是,平时应该用迭代器。