2011-10-22 77 views
1

這樣的語言是可行的嗎?或者有特定的功能,絕對需要某種形式的gc嗎?如果gc是可選的,該怎麼辦?

注意:我不是反gc,而是來自C/C++後臺並在實時服務器應用程序上工作,我更喜歡保持某種程度的控制如何以及何時獲得內存(不能有10秒鐘的垃圾收集發生在正在運行的中間)。

根據我的要求,我的擔心是否現實?或者是gc這麼好,我的擔憂是沒有根據的?

Go的gc是我唯一的一個關於嘗試使用我的C++實時服務器端口的預留空間。

+2

你可能會特別提出一個關於如何測量GC運行時影響的單獨問題。 –

+1

不知道去,但十秒(!)垃圾收集聽起來不太可能與現代技術。幾毫秒的可能性更大,並且操作系統通常會因運行病毒掃描程序,喚醒休眠進程和交換虛擬內存而導致延遲。 –

+1

我還沒有試過去,但你的要求非常模糊。你自己衡量一下會好得多。根據不同情況,GC算法可能會妨礙您的工作。以這種通用的方式提出問題不會給你一個有用的答案。你能忍受多少中斷時間?即使Windows不是實時操作系統。你在談論真正的實時還是其他? –

回答

3

使用可選的GC將需要更改語言。這裏是一個完全有效的運轉功能,這將使C程序員的雞皮疙瘩:

func foo() *int { 
    a := 1 
    return &a 
} 

這是很好的,因爲圍棋編譯器會找出a需要的變量堆上分配。這將是垃圾收集後,你不必在意。 (好的,在某些情況下,你可能會,但大多數情況下你不會)

你可以編譯各種場景,編譯器會做這樣的事情。沒有垃圾收集器,它就不會一樣。

有些事情可以幫助GC時間,但在某種程度上,您將會取消語言的優勢。我毫不猶豫地推薦這些做法,而是選擇:

  • 免費名單
  • 隨着不安全的包,你甚至可以編寫自己的分配器和手動釋放內存,但你需要爲你希望每個類型的函數分配。或者使用反射來傳遞你想要分配的類型,返回一個空的接口,並使用類型斷言來獲取具體值。

底線是,對於具有實時實時要求的應用程序,Go可能不是一個好的選擇。也就是說,我也不認爲你會看到任何接近10秒的垃圾收集。考慮你的要求是什麼,如果你有任何疑問,請做一些測量。

如果可以,請嘗試最新的Go代碼。有一些垃圾收集器的改進和一些編譯器優化,導致更少的分配。但是,如果您的發佈時間較短,您可能會堅持幾個月的當前穩定版本。

+0

感謝您的建議 - 很高興聽到關於go的新進展。我期望在進行中,我可以通過做大塊分配而不是分配許多小對象和編寫更緊密的代碼來幫助gc ... – kfmfe04

+0

是的,像自由列表這樣的東西可以提供幫助。稍微編輯我的答案。 –

+0

@EvanShaw,您可以參考計算GC,參考您提供的示例,並獲得確定性運行時間。我認爲CPython會重新計算GC,並且如果用戶遠離循環數據結構,它就會消失。你不能做類似的東西嗎? –

相關問題