2012-03-03 62 views
0

我只是在Coursera聽講座(https://www.coursera.org/saas/),教授說Ruby中的一切都是一個對象,並且每個方法調用都在對象上調用send方法,並傳遞一些參數給它。這包括數字,數組和其他基本類。Ruby效率

我去谷歌和尋找效基準,我發現了以下內容:http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

雖然它不是令人震驚的是編譯語言比解釋的速度更快,(紅寶石,蟒蛇)和Java之間的性能差異比如令人震驚。

即使有一種編譯ruby代碼的方法(我還沒有研究過這個主題),我認爲由於核心「問題」在語言中效率問題仍然存在: 基本操作太重了: 1 + 1需要更多的CPU週期才能完成。

我愛Ruby。我喜歡元編程的高層次方面,我認爲這是未來應該前進的方向,我同意,有時我們需要妥協某些事情才能更有效:我沒有看到自己在彙編中優化我的代碼爲了節省幾個額外的毫秒。但是,當我們在C中執行1 + 1時,它不會成倍增加基本操作的時間量!

我的問題是你們如何處理密集型操作程序?我們有一個我們已經開發了大約一年的Ruby on Rails項目,現在我們開始做一些機器學習,並進行地理位置遍歷和優化。

我希望你明白我的顧慮,並提供:-)

+2

對於在ruby中添加兩個fixnums所花費的時間沒有任何指數。它仍然是'O(1)'(並且添加兩個bignum是'O(log n)')。 – sepp2k 2012-03-03 09:44:57

+0

Ruby中的1 + 1查找1的類型,發現它是一個Fixnum,在查找表中查找+方法,執行它並返回結果。它需要一些額外的步驟,這是一個固定的數字,理論上,你是對的,這是一個O(1)。但實際上,如果每種方法都這樣做,所花費的時間就會「呈指數級增長」(正如我在基準測試中所看到的那樣)。我傾向於區分理論算法複雜性和實際算法複雜性。桶排序是要看看http://en.wikipedia.org/wiki/Bucket_sort – Abdo 2012-03-03 09:58:43

+5

不,如果一切方法做到這一點,時間增加是線性的。每次添加方法調用時,程序的運行時間不會加倍。它增加了一個不變的因素。您可以儘可能多地區分理論和現實生活 - 「指數」仍然不是「大」的同義詞。 – sepp2k 2012-03-03 10:04:45

回答

2

合理的建議,這是不是一個壞的問題,因爲它似乎在看評論。唯一的問題是錯誤使用的詞指數,但描述的問題是真實的。

我有類似的Ruby使用模式,你所描述的 - 我在Ruby中做了很多自然語言處理,它也涉及到機器學習。 我用下面的技術來克服Ruby的性能問題:

  1. 使用C庫Ruby接口時適用。例如。我不會使用Ruby實現SVM或決策樹,因爲在C中有更快的實現。

  2. 如果C語言不可用,請編寫我自己的Ruby包裝程序。通常這不是什麼問題 - 我廣泛使用RubyInline gem來將Ruby與C代碼粘合在一起。

  3. Patch Ruby內存管理或手動控制其垃圾回收器。

  4. 考慮JRuby作爲您的Ruby平臺 - 您可以輕鬆訪問用於機器學習(Weka)等的快速Java庫,並且您的應用程序的一般性能可以保留甚至更好。

+0

聽起來像一個很好的計劃。你覺得這是一件實際的事情嗎?或者在不同的地方將C代碼附加到Ruby代碼中是否很麻煩?非常感謝你! :-) – Abdo 2012-03-04 22:15:24

+0

其基本思想是使用良好的Ruby接口覆蓋所有C代碼,並保持C代碼基本儘可能小。如果事實證明,你有很多C代碼與Ruby代碼混合在一起,最好使用它自己的測試編寫單獨的C庫。這使得代碼更加模塊化,更易於維護。 – 2012-03-05 11:56:44

+0

謝謝@Aleksander! – Abdo 2012-03-06 12:00:23