设为首页 收藏本站
查看: 1240|回复: 0

[经验分享] C++/D/python性能一比

[复制链接]

尚未签到

发表于 2017-4-26 06:49:12 | 显示全部楼层 |阅读模式
实际上不是全面测试性能。应该这么说:使用一个你熟悉的语言,用它写出一个高效的版本(做下面那件事)。

不小心读到一个帖子: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就特别慢,也可能是使用不正确。


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-369211-1-1.html 上篇帖子: python No-ASCII character ,编码错误 下篇帖子: 使用python操作串口 ★☆★
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表