【发布时间】:2014-01-29 18:52:16
【问题描述】:
我一直试图说服我的一个朋友避免使用动态分配的数组并开始转向 STL 向量。我给他发了一些示例代码来展示一些可以用 STL 和仿函数/生成器完成的事情:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#define EVENTS 10000000
struct random_double {
double operator() () { return (double)rand()/RAND_MAX; }
};
int main(int argc, char **argv){
std::vector<double> vd (EVENTS);
generate(vd.begin(), vd.end(), random_double());
copy(vd.begin(), vd.end(), std::ostream_iterator<double>(std::cout, "\n"));
return 0;
}
他对此的回复,虽然他觉得它更优雅,但他自己的代码更快(几乎是 2 倍!)这是他回复的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define EVENTS 10000000
__inline double random_double() {
return (double)rand()/RAND_MAX;
}
int main(int argc, char **argv){
unsigned int i;
double *vd;
vd = (double *) malloc(EVENTS*sizeof(double));
for(i=0;i<EVENTS;i++){ vd[i]=random_double(); }
for(i=0;i<EVENTS;i++){ printf("%lf\n",vd[i]); }
free(vd);
return 0;
}
所以我运行了简单的计时测试来看看会发生什么,这就是我得到的结果:
> time ./c++test > /dev/null
real 0m14.665s
user 0m14.577s
sys 0m0.092s
> time ./ctest > /dev/null
real 0m8.070s
user 0m8.001s
sys 0m0.072s
使用 g++ 的编译器选项是:g++ -finline -funroll-loops。没什么特别的。谁能告诉我为什么在这种情况下 C++/STL 版本比较慢?瓶颈在哪里,我能否向我的朋友推销使用 STL 容器?
【问题讨论】:
-
好吧,对于初学者来说,C 代码存在明显的内存泄漏......
-
C++ 从 -O2 中获益比 C 更多。
-
@Timo: true,但在这种情况下,进程会立即结束并将内存返回给操作系统。
-
修复了内存泄漏 - 我向我的朋友指出这是使用 STL 的好处之一 - 更少的内存泄漏 :)
-
STL 向量也是动态分配的……通常遵循大小加倍算法。 STL 有很多优点,但这不是其中之一。
标签: c++ optimization compiler-construction io