2012-02-04 18 views
0

是否值得花時間編寫代碼來重用C語言中的線程,還是便宜的創建和銷燬?值得重用的C線程?

我渲染一些CPU只有3D圖形,它是非常慢(看起來像約5幀)。我嘗試使用線程來解決這個問題。使用4個線程,每個線程渲染一個屏幕條,似乎將我的幀速率提升到非常合理和平滑的狀態。我仍然擔心當我的圖形更復雜時會發生什麼。我會重新使用我的線程,而不是在每一幀創建和銷燬它們,從而獲得明顯的速度提升嗎?

編輯:我正在使用的操作系統是Windows。

+0

每個_frame_?我很確定這將會很昂貴。 – 2012-02-04 22:17:56

+0

投票不具建設性。重用你的線程(通過線程池)將節省開銷,但是否真的需要這個是主觀的;如果你遇到與線程創建相關的性能問題,那麼是的。 – 2012-02-04 22:18:05

+0

絕對重用一個線程池的線程,說 – 2012-02-04 22:24:09

回答

3

由於使用1個線程可以獲得大約5 fps,推測可以使用4個線程,您可以達到20 fps左右的某個位置?那麼,如果你不保留它們,你會每秒創建並銷燬80多個線程?線程相當輕量級,但我認爲你會開始注意到那麼多開銷。

+0

每秒80沒有什麼,除非Windows吸收超過我意識到。每幀80幀可能代價很高,但在Linux上,線程創建成本大約在20微秒左右。沒有我想要的那麼低,但在每秒80次,即1600微秒,即1.6毫秒或0.16%的開銷。 – 2012-02-04 22:40:02

+0

好的,我會嘗試重用我的線程,如果它太慢,謝謝。線程的速度似乎存在一些爭議。 – 2012-02-04 22:51:42

+0

我有興趣從Windows體驗中聽到ppl的體驗,在Windows上創建線程有多慢。 – 2012-02-05 00:04:15

1

你會消除相當多的開銷和延遲,是的。 TBH,我不明白爲什麼這麼多開發人員會不斷創建和銷燬主題 - 這是效率低下,困難並容易發生泄漏和其他災難的原因。

+0

我不同意。根據需要創建和銷燬線程可以實現乾淨而簡單的資源管理。合併和重用它們會迫使您對線程和資源生命週期進行更復雜的管理。對於許多任務來說,性能是一個不會經常創建和銷燬線程的有力理由,但是在體面的操作系統中,性能問題只會在每秒達到數萬個線程時纔會出現。請記住,指示一個條件變量很容易花費10-20%的時間來啓動一個新的線程。 – 2012-02-04 22:44:05

+0

那麼,同意不同意這個問題會容易得多,而不是開始一個線程設計的聖戰。 – 2012-02-04 23:16:08

+0

不需要聖戰。 :-)我同意這兩種方法都有優點,但我認爲「常識」有點過時並且朝一個方向發展,而簡單的論點卻與此背道而馳。仍然有兩個地方。我傾向於傾向於讓線程的生命週期與其任務/數據域相一致,該任務/數據域位於池之間(將新任務/數據重新分配給現有線程)以及不斷創建/銷燬。 – 2012-02-05 00:03:49