2011-10-12 65 views
2

我對簡單放慢ruby代碼評估感興趣。當然我知道使用睡眠(),但這並不能解決我的問題。Ruby:減速評估

相反,我想減慢VM中發生的每個對象實例化和銷燬。

爲什麼?所以我可以通過觀察它們被執行來了解紅寶石中的特定程序是如何工作的。我最近了解了ObjectSpace以及查看/檢查當前生活在Ruby VM中的所有對象的能力。看起來,在ObjectSpace中構建這些對象的對象和屬性的簡單實時顯示,然後放慢評估就可以實現這一點。

我意識到可能有實時查看ruby進程內發生的更詳細的日誌的方法,包括許多在低級別實現的程序,低於實際的ruby代碼級別。但我認爲,僅僅看到實時創建和銷燬對象及其屬性將會更具啓發性,更容易遵循。

+6

我從來沒有聽到有人抱怨Ruby之前太快! –

回答

1

如果您想在每次實例化對象時輸出一些信息,您可以通過重寫Class#new來實現。這裏有一個例子:

class Class 
    alias old_new new 

    def new(*args) 
    puts "Creating: #{self.inspect}" 
    sleep 0.1 
    old_new(*args) 
    end 
end 

class Point 
end 

class Circle 
end 

alias old_new new行創建一個備份new方法,所以我們可以有原來的行爲。然後,我們重寫new方法,並放置一些代碼來檢查主題類,併爲了更好的可讀性而睡一會兒。現在,如果你調用Point.new,你會看到「Creating:Point」。 Circle.new將顯示「Creating:Circle」等。任何創建的對象都會被記錄下來,或者至少是它們的類,並且會有一點延遲。

該示例是一個從here的修改版本。

至於對象的破壞,我不知道是否有明智的方法來做到這一點。您可以嘗試覆蓋GC module中的某個方法,但只有在需要時纔會啓動垃圾回收(據我所知),所以您可以輕鬆使用ruby玩一會兒,而不會發生垃圾回收。無論如何,這可能不會很有用。

+0

這會有所幫助,但是用這種方式解決OP問題將涉及打開不同類/方法的gobs,並添加基本相當於將日誌代碼添加到其中的方法,然後還可以解析生成的日誌。 只需檢查ObjectSpace是否完美,除非它太快了。 – themirror

+0

我可能不是很清楚,沒有必要打開所有的類,只有'Class'。我已經更新了一些答案,以便澄清。由於每當一個對象被實例化時都會調用'Class#new',所以一個小的'sleep'會允許實例化之間的延遲,這可能有助於理解正在發生的事情。 –

0

我認爲問題不在於ruby太快。

在你的情況下,你應該使用一些軟件架構,例如Model-View-Controller。

它可能是這樣的。在視圖中,您可以顯示控制器應以何種速度向您顯示信息的選項,或者您可以減慢速度或提高顯示信息的速度。然後Controller評估小步驟(在Model中調用方法)並在View中呈現評估結果。

視圖並不總是瀏覽器或窗口應用程序,它也可能只是一個簡單的終端。

2

你可能會喜歡這個問題的答案:getting in-out from ruby methods

隨着小編輯代碼報道在那裏,你可以睡眠添加到每個方法調用,並按照代碼執行。