2013-05-21 32 views
4

我正在考慮將d用於我正在進行的圖形引擎。讓我失望的一件事是GC。將D用於實時應用程序?

我還是一個年輕的程序員,我可能對GC有很多誤解,希望你能澄清一些問題。

我的目標是低延遲和一般的時間是至關重要的。從我所知道的GC是非常不可預測的,例如我的應用程序可以每16.6ms渲染一幀,並且GC的任何時間可以上升到30ms等任何數字,因爲它不是確定性的嗎?

我讀到你可以關閉D中的GC,但是你不能使用D的大部分標準庫,並且GC沒有完全關閉。這是真的?

您認爲在時間關鍵型應用程序中使用D是否合理?

+2

顯然有現在是一個併發GC能極大地減少停頓和用於需要「低延遲」系統:http://www.reddit.com/r/programming/comments/1eovfu/dconf_2013_day_1_talk_6_concurrent_garbage/ – delnan

+1

這是利用研究項目D1;這在這裏並沒有什麼幫助。雖然,一些討論是相關的。 –

+0

一個建議,因爲你在學習:專注於首先完成所有事情,然後再以它的速度完成 - 前者很難獨立完成! (imho,使用D有意義無論如何) – vines

回答

8

簡短回答:它需要大量的定製,如果您不是經驗豐富的D開發人員,可能會非常困難。問題

列表:

內存管理本身不是大問題。在實時應用程序中,您永遠都不想在主循環中分配內存。爲所有主要數據預先分配內存池是實現這種應用程序的實際標準方式。從這個意義上說,D沒有什麼不同 - 你仍然直接調用C malloc來爲你的池獲取一些堆,而這個內存不會被GC管理,它甚至不會知道它。

但是,某些語言功能和Phobos的大部分使用GC自動地。例如,如果沒有某種形式的自動管理分配,就無法真正連接切片。很長一段時間裏,火衛一直沒有一個強有力的政策。

很少有語言觸發的分配本身不會成爲問題,因爲大多數使用的內存都是通過池管理的。然而,股票D:中的實時軟件存在一個殺手問題,默認D垃圾收集器是停止世界。即使幾乎沒有垃圾,當收集週期運行時,整個程序都會遇到延遲峯值,因爲所有線程都會被阻塞。

可以做什麼:

1)使用GC.disable();關掉回收週期。它將解決世界各地的問題,但是現在您的程序會在某些情況下開始泄漏內存,因爲基於GC的分配仍然有效。

2)轉儲隱藏的GC分配。有一個-vgc交換機的請求,我現在找不到,但是如果沒有,你可以編譯你自己的druntime版本,打電話回撥gc_malloc()。您可能希望將其作爲自動測試套件的一部分運行。

3)完全避免火衛一,並使用https://bitbucket.org/timosi/minlibd等東西作爲替代。

做所有這些應該足以滿足遊戲開發者典型的軟實時需求,但正如你所看到的,它並不簡單,並且需要逐步缺貨D分佈。

未來的選擇:

一旦萊昂德羅Lucarella港口他concurrent garbage collector到D2(這是計劃,但尚未安排),局面將變得更加簡單。少量GC管理的內存+並行實施將允許即使不禁用GC也能滿足軟實時要求。即使Phobos在從最煩人的分配中剝離後也可以使用。但我認爲這不會很快發生。

但是硬實時呢?

你最好別嘗試。但這是另一個故事要講的。

2

如果你不喜歡GC - 禁用它。

方法如下:

import core.memory; 

void main(string[] args) { 
    GC.disable; 
    // your code here 
} 

自然,那麼你將不得不做內存管理自己。這是可行的,並且有幾篇關於它的文章。這裏也討論過,我只是不記得這個主題。

dlang.org也有關於此的有用信息。這篇文章,http://dlang.org/memory.html,觸及了實時編程的主題,您應該閱讀它。

又一篇好文章:http://3d.benjamin-thaut.de/?p=20

+0

從我所知道的是GC仍然會運行,即使它被禁用。你能否確認或否認這一點?如果我禁用了GC,我仍然無法使用std庫的90%? –

+0

它不會運行,因爲收集週期永遠不會運行,但它仍然存在,並在需要時分配內存。出於這個原因,你將能夠使用std庫與禁用GC,但它會泄漏地獄。 –

相關問題