首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于简单数组创建和i/o的C与C++代码优化

用于简单数组创建和i/o的C与C++代码优化
EN

Stack Overflow用户
提问于 2009-12-19 03:01:38
回答 8查看 860关注 0票数 2

我一直在试图说服我的一个朋友避免使用动态分配的数组,并开始转向STL向量。我给他发了一些示例代码,展示了可以使用STL和functors/生成器完成的一些事情:

代码语言:javascript
运行
复制
#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代码:

代码语言:javascript
运行
复制
#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;
}

所以我运行了一个简单的计时测试,看看会发生什么,下面是我得到的结果:

代码语言:javascript
运行
复制
> 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容器吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-19 03:15:39

使用printf:

代码语言:javascript
运行
复制
  for (std::vector<double>::iterator i = vd.begin(); i != vd.end(); ++i)
     printf("%lf\n", *i);

结果是:

代码语言:javascript
运行
复制
koper@elisha ~/b $ time ./cpp > /dev/null
real    0m4.985s
user    0m4.930s
sys     0m0.050s
koper@elisha ~/b $ time ./c > /dev/null
real    0m4.973s
user    0m4.920s
sys     0m0.050s

使用的标志:-O2 -funroll-loops -finline

票数 17
EN

Stack Overflow用户

发布于 2009-12-19 03:05:40

几乎可以肯定的是,使用iostream库还是使用printf()。如果你想给算法计时,你应该在循环之外输出。

票数 19
EN

Stack Overflow用户

发布于 2009-12-19 03:06:44

使用STL,特别是在使用向量和其他很好的实用类时,可能总是比使用malloc和内联函数的手写C代码慢。没有真正的方法可以绕过它。

话虽如此,但性能并不代表一切--也不是那么简单。使用STL还提供了许多其他好处,包括:

  1. 更好的可维护性:它更具表现力,所以你可以用更少的代码完成更多的工作,在一个更优雅、更干净的fashion.
  2. Safety:中使用向量比使用向量和函数处理指针和
  3. 要安全得多,如果你需要动态增加这个集合,你会更容易。对于example.
  4. Productivity:来说,通过使代码更干净,
    1. 促进重用比许多单独的C例程更有效地执行类似的功能。

你实际上是在试图争论在更高的抽象级别上工作-这里有权衡,通常是在性能方面,但有一个原因,几乎所有的开发都到了更高的抽象级别;在大多数情况下,收益比牺牲要有价值得多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1930081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档