實際上不是全面測試性能。應該這么說:使用一個你熟悉的語言,用它寫出一個高效的版本(做下面那件事)。
不小心讀到一個帖子: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就特別慢,也可能是使用不正確。
只是剛好看到這個比較,忍不住參與一下,切勿當真。