新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 對比Ruby和Python的垃圾回收

        對比Ruby和Python的垃圾回收

        作者: 時間:2016-09-12 來源:網絡 收藏

        注:這篇文章基于我在布達佩斯的RuPy大會上所作的演講。我覺得與其直接將幻燈片發布出來,不如在我還有印象的時候將它寫成博客來的更有意義。同樣,我會在將來發布RuPy大會的視頻鏈接。我計劃將在Conf大會上發表類似的演講,除了有關于的部分,并且將對比MRI,J以及Rubinius的器是怎樣工作的。

        本文引用地址:http://www.104case.com/article/201609/304199.htm

        如果想要對器以及內部原理有更加深入的了解,你可以在我即將出版的新書《Ruby Under a Microscope》中找到答案。

        circuitory-sysvsdtem-polish

        如果算法和業務邏輯是一個人的大腦,那么機制是人體的哪個器官呢?

        在”Ruby ”大會上,我想對比Ruby和內部的垃圾回收機制是一件很有意思的事情。在開始之前,我們為什么要討論垃圾回收機制呢?畢竟這是一個最迷人的,最令人激動的主題,不是嗎?你們有多少人對垃圾回收機制感到興奮?(許多的大會參與者竟然舉起了雙手!)

        最近,在Ruby社區中有一篇帖子,關于怎樣通過修改Ruby GC的設置來提高單元測試的速度。這棒極了!通過減少GC垃圾回收的處理來提高測試的速度,這是一件很好的事情,但是不怎的,GC不會真正的讓我感到興奮。就如咋一看就感覺令人厭煩,枯燥的技術帖子。

        事實上,垃圾回收是一個令人著迷的主題:垃圾回收算法不僅是計算機科學歷史一個重要的部分,更是前沿研究的一個主題。例如,MRI Ruby解釋器使用的”Mark Sweep”算法已經超過了50年的歷史,與此同時,在Rubinius解釋器中使用的一種垃圾回收算法,是在Ruby中的另一種實現方式,這種算法僅僅是在2008才被研究出來。

        然而,”垃圾回收”的這個名稱,是非常的不恰當的。

        應用程序的心臟

        垃圾回收系統要做的不僅僅是”回收垃圾”。事實上,它主要完成三個重要任務:

        為新的對象分配內存

        標記垃圾對象

        回收垃圾對象占用的內存

        想象你的應用程序是一個人的身體:所有你寫的優雅的代碼,你的商業邏輯,你的算法,將會成為你的應用程序的大腦或智能。與此類似的,你認為垃圾回收器會成為身體的哪一個部分呢?(我從大會的聽眾中得到了很多有趣的答案:腎,白細胞)

        heart-polishefwefwefwefwef

        我認為垃圾回收器是一個應用的心臟。正如心臟為身體的其他部分提供血液和養料一樣,垃圾回收器提供內存和對象供程序使用。如果你的心臟停跳,你將活不了幾秒。如果垃圾回收器停止運行或者變慢,就像動脈阻塞一樣,你的程序將變的慢下來最后死掉!

        一個簡單的例子

        通過例子來驗證理論是一種很好的方式。這里有一個簡單的類,用Python和Ruby寫成,我們可以將它們作為一個簡單的例子:

        codfdbfdhhgrthrthrth45t34te

        于此同時,兩種代碼如此相似讓我感到非常吃驚:Python和Ruby在表達相同的語義時幾乎沒有差別。但是,兩種語言的內部實現方式是否相同呢?

        空閑對象鏈表

        在上面的代碼中,當我們調用了Node.new(1)之后,ruby將會做什么?也就是說,Ruby怎樣創建一個新的對象?

        令人驚訝的是,Ruby做的事情非常少!事實上,在代碼運行之前,Ruby解釋器會提前創建成千上萬的對象放置到一個鏈表中,這個鏈表被稱為”空閑對象鏈表”(free list)。空閑對象鏈表(`free list`)在概念上看起來像下面的樣子:

        frgfbfgthrthrthee-list1

        每一個白色方塊可以想象成一個預創建的,沒有使用的Ruby對象。當我們調用Node.new,Ruby簡單的使用一個對象,并且將它的引用返回給我們:

        freegfhhrthrth-list2

        在上圖中,左邊的灰色方塊代表一個活躍的Ruby對象,被我們的代碼所使用,而其余的白色方塊代碼沒有使用的對象。(注意:當然,圖中是一種簡化的實現版本。事實上,Ruby將會使用另外一個對象保存字符串”ABC”,使用第三個對象保存Node的定義,以及其他的對象保存代碼處理過的抽象語法數”AST”,等待。)

        如果我們再次調用Node.new,Ruby僅僅返回另外一個對象的引用。

        frefbhfhthrte-list3
        mcchkhkhkhjkarthy

        約翰麥卡錫在1960年在Lisp中首次實現了垃圾回收機制

        這中使用預創建對象鏈表的簡單算法發明于50多年前,它的作者是傳說中的計算機科學家,約翰麥卡錫,正是他實現了最初的Lisp解釋器。Lisp不僅是第一個函數式編程語言,并且包含了計算機科學中許多突破性的進展。其中之一便是通過垃圾回收機制自動管理內存。

        標準版Ruby,也就是”Matz’s Ruby Interpreter”(MRI),使用了一種類似于約翰麥卡錫在1960年實現的Lisp的垃圾回收算法。就像Lisp一樣,Ruby會預先創建對象并且在你創建對象或值的時候返回對象的引用。

        在Python中分配對象內存

        從上面我們可以看出,Ruby會預先創建對象,并且保存在空閑對象鏈表(free list)中。那么Python呢?


        上一頁 1 2 3 下一頁

        關鍵詞: Ruby Python 垃圾回收

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 遂平县| 常熟市| 通城县| 青铜峡市| 自贡市| 吉安县| 南投市| 松江区| 洞口县| 凤山县| 织金县| 阿拉善左旗| 青海省| 永靖县| 清苑县| 光泽县| 汝南县| 五指山市| 泸溪县| 乐至县| 渝中区| 通江县| 鄱阳县| 察哈| 平乐县| 龙岩市| 涞水县| 湘潭市| 托里县| 淮阳县| 沁水县| 青神县| 耿马| 内黄县| 铜川市| 平谷区| 通榆县| 宣恩县| 佛山市| 昭通市| 岳普湖县|