2017-09-14 71 views
-3

在製作多語言生成文件(啓動數千個進程)時,我注意到腳本語言的啓動性能差異很大爲什麼Python,Ruby和Node.js比Bash,AWK,Perl慢得多?


猛砸

$ TIMEFORMAT='%3R'; time bash -c "echo 'hello world'" > /dev/null 
0.002 

AWK

$ TIMEFORMAT='%3R'; time awk "BEGIN { print \"hello world\" }" > /dev/null 
0.002 

的Perl

$ TIMEFORMAT='%3R'; time perl -e "print \"hello world\n\"" > /dev/null 
0.003 

所有這些基本上是相同的。但是,然後這些腳本語言中的每一個都是一個數量級(!)較慢。

的Python

$ TIMEFORMAT='%3R'; time python -c "print 'hello world'" > /dev/null 
0.023 

紅寶石

$ TIMEFORMAT='%3R'; time ruby -e "puts 'hello world'" > /dev/null 
0.024 

Node.js的

$ TIMEFORMAT='%3R'; time node -e "console.log('hello world')" > /dev/null 
0.082 

什麼東西種類是從Python,Ruby,Node.js的和做的,以使他們如此慢得多比等效的Bash,AWK和Perl程序還要多?這只是事情發生的方式,還是有一些更重要的關於他們的設計,使他們有更多的開銷?

+0

紅寶石加載寶石,試試'ruby --disable-gems -e「...」' – Stefan

回答

4

在你的例子中,你幾乎只測量他們開始的時間。因此,最慢的3個是最慢的,因爲他們的解釋器在開始的時候做的更多,但不一定意味着在長時間運行的程序中它們會更慢。您可以編寫一些長時間運行的示例(您可以在其中進行數千次計算),然後您就可以看到哪一個實際上最慢。請注意,其中的每一個都是針對不同的事物,因此其中一個處理文件的速度可能非常快(awk),而其他處理將同時處理10個事件的速度非常快(Node.js)。

+0

當然可以。但我沒有運行長時間運行的程序。我正在運行很多短時間運行的程序。 (這是如何使作品。)我不認爲這是一個答案。 –

+0

由於您沒有指定您正在使用哪種實現,因此無法說出那些實現可能影響其啓動性能的操作。例如,JRuby通常會首先啓動一個JVM(它包含一個*巨大的*標準庫,可能包括或不包括解釋器和/或多個編譯器),然後啓動JRuby,然後啓動一個JRuby實例, turn包括一個解釋器,兩個編譯器和一個相當大的運行時庫,最後但並非最不重要的是將加載Ruby核心庫(它也相當大),而後者又包含RubyGems。 –

相關問題