C++/D/python性能一比

C++/D/python性能一比
实际上不是全面测试性能。应该这么说:使用一个你熟悉的语言,用它写出一个高效的版本(做下面那件事)。

不小心读到一个帖子:http://blog.vckbase.com/jzhang/archive/2006/03/28/18807.html

看到C++竟然被比下去了,自然不是很舒服,毕竟C++对于C并没有太大的性能上的降低,而python是C写的(指Cpython实现),自然不会高过C。(废话,C基本上接近汇编效率了)

可惜C++又很难找出这么高效的实现,STL效率还是低了些(为什么?一直以为它很高效,用得比较放心)。最近一直比较关注D语言,于是用D语言来测试一下。代码如下:

 1  import std.stdio;
 2  import std. string ;
 3  import std.perf;
 4 
 5  int  main( char [][] argv)
 6  {
 7     if  (argv.length  <   3 ) {
 8      writefln( " Wrong arguments " );
 9       return   1 ;
10    }
11 
12     const   int  READ_SIZE  =   1024 ;
13 
14    FILE *  fin  =  fopen(argv[ 1 ],  " r " );
15    FILE *  fout  =  fopen(argv[ 2 ],  " w " );
16     char  buffer[READ_SIZE];
17     int [ char []] emails;
18 
19    PerformanceCounter counter  =   new  PerformanceCounter();
20    counter.start();
21     while  ( ! feof(fin)){
22      fgets(cast( char * )buffer, READ_SIZE, fin);
23       char [] email  =  toString(cast( char * )buffer);
24       if  ( ! (email  in  emails)){
25        emails[toString(buffer)]  =   0 ;
26        fputs(cast( char * )email, fout);
27      }
28    }
29 
30    fclose(fout);
31    fclose(fin);
32    counter.stop();
33 
34    writefln(counter.milliseconds());
35     return   0 ;
36  }
37 

没加fopen失败处理。

测试结果在我的机器上耗时只有python版本的1/3,我看到其它网友的C++实现最好成绩也不过1/2,由于是D是C语言所写,测试使用的又是C库,自然可以认为C语言还是比较高效的。

上面的D语言代码里调用了toString,把char*转为char[],它的源代码如下:
char [] toString( char   * s)
{
    
return  s  ?  s[ 0  .. strlen(s)] : cast( char []) null ;
}

如果s[0 .. strlen(s)]产生了复制的话,应该是会影响性能的。char[]对象是受GC管理的,应该会复制一份。这种情况下还能有如此高的效率,的确很不错。

不过python的性能让我感觉很吃惊,以前只测试过字符串连接,感觉比较高效。

写了一个完成一样功能的ruby程序,耗时接近python版本的2倍,当然由于对它不是很熟,可能写得不够高效。
 1  emails  =  Hash. new
 2 
 3  start  =  Time.now
 4  fout  =  open( ' email-2-new1.txt ' ' w ' )
 5  open( ' email-2.txt ' ).each  do   | line |
 6     if   ! emails.has_key ?  line
 7      emails[line]  =   0
 8      fout  <<  line
 9    end
10  end
11  puts Time.now  -  start
12 

正如某网友所说,这个程序的瓶颈在于IO,拿来作性能上的比较或许是不合适的。从语言效率上来讲,自然是C++和D相当,可能会比D高,python应该会低很多。但在很多情况下,衡量效率不光是语言本身,还有库,没有库的语言是没什么吸引力的。python是一种很“慢”的语言,相对C/C++来说,不过它是一门实用性的语言,所以它为一些特定用法做了优化,取得了不错的成绩。C++是一门通用语言,或许太注重语言的性能了,忽略了库,导致库把性能给拉下来了。这种情况下,有人评测java和C++的性能,结果是java要高,自然是不那么让人惊奇的了。可是如果标准库都这么慢,那还能指望什么呢?

当然也并没有证明STL就特别慢,也可能是使用不正确。


只是刚好看到这个比较,忍不住参与一下,切勿当真。

你可能感兴趣的:(C++/D/python性能一比)