2016-08-25 77 views
3

我正在爲我創建了一個字節碼解釋器,以及它需要非常快,對於這一點,我不希望GC成爲瓶頸,所以我禁用它,使用GC.disable();是否可以禁用D的GC?

但通常我在網上看到D的庫需要GC在那裏,但我沒有使用很多庫,我的問題是,如果我使用以下模塊中的以下內容,它是否需要GC?:

    從std.algorithm
  1. to從std.conv
  2. canFind
  3. file.read從std.file
  4. File從std.stdio

我使用從各模塊的上述功能在我的程序,規定,是安全的禁用GC?

回答

7

您誤解了GC禁用的功能。 除非您直接編譯出來,否則GC始終可以通過例如新。

現在如何GC的工作,當你分配新的內存它以確定它是否可以分配,且如果它的一些基礎知識不是必須嘗試和清理現有的內存能夠分配。因此,任何時候都有一個分配,可以繼續收集。現在禁用GC只是阻止它繼續進行並在分配時進行收集。你總是可以手動激勵它來做到這一點。

傳譯員只要你防止分配(重用內存),你不會需要甚至禁用GC,以防止它放慢你失望。所以請記住規則,「大」的分配和重用內存!

5

如果你只是想避免調用垃圾收集,訣竅是不是爲GC清理創建任何對象。值得慶幸的是,d有將檢查在編譯時間,以確保您沒有意外產生任何垃圾屬性:@nogc

那裏是一個很好的說明:http://ddili.org/ders/d.en/functions_more.html

+0

沃爾特介紹了避免堆分配寫入基於範圍的代碼[通話](https://www.youtube.com/watch?v=znjesAXEEqw)。 – rcorre

3

另外請注意,您可以把垃圾收藏家重新開始,讓它收集起來,然後當你的翻譯員閒置時再把它收回。我在D中製作遊戲時使用了這種技術。它完美地工作。

// Run the GC when we want 
core.memory.GC.enable(); 
core.memory.GC.collect(); 
core.memory.GC.disable(); 
相關問題