gpt4 book ai didi

c++ - 用于简单数组创建和 i/o 的 C vs C++ 代码优化

转载 作者:太空狗 更新时间:2023-10-29 23:21:03 26 4
gpt4 key购买 nike

我一直试图说服我的一个 friend 避免使用动态分配的数组并开始转向 STL vector 。我给他发了一些示例代码来展示一些可以用 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 版本在这种情况下速度较慢?瓶颈在哪里,我能否说服我的 friend 使用 STL 容器?

最佳答案

几乎可以肯定是 iostream 库与 printf() 的使用。如果您想为算法计时,您应该在循环外进行输出。

关于c++ - 用于简单数组创建和 i/o 的 C vs C++ 代码优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com