我正在嘗試製作一個基本上可以計算的應用程序(並且學習C#)。越快越好。C#多線程遞增
這就是爲什麼最初我在考慮多個線程。然而,正如我所看到的那樣,這是不可能的,因爲多線程的要點是同時並行運行代碼,對吧?
那麼,我可以使用多個線程?或者任何一般的提示,以使其增加更快?
謝謝。
我正在嘗試製作一個基本上可以計算的應用程序(並且學習C#)。越快越好。C#多線程遞增
這就是爲什麼最初我在考慮多個線程。然而,正如我所看到的那樣,這是不可能的,因爲多線程的要點是同時並行運行代碼,對吧?
那麼,我可以使用多個線程?或者任何一般的提示,以使其增加更快?
謝謝。
你必須劃分數字範圍。例如,不是在一個線程中從0增加到999'999,而是讓四個線程從0增加到249'999,從250'000增加到499'999,從500'000增加到749'999,從750'000增加到999 '999分別。
然後看看Task Parallelism (Task Parallel Library)。
不要讓錯誤創建遞增一次百萬的任務!多任務開銷實際上會大大減緩過程。如果每項任務都需要執行大量工作,則實際上只能在速度上獲得收益。
是的,工作領域需要分成範圍(bin),然後並行處理可以幫忙。 –
這聽起來很有趣。我沒有這樣想過。將它分割成多個範圍聽起來就像是要走的路。 –
爲了獲得最佳性能,對於簡單遞增單個變量,我會使用經常被忽視的類Interlocked。
private long SingleVariable = 0;
public void MultiThreadedMethod()
{
Interlocked.Increment(SingleVariable);
}
雖然會有從多線程沒有感覺到的利益,在性能這個簡單的例子明智,因爲我期望的高速緩存(高速緩存一致性網絡)帶寬是在這樣的情況下的瓶頸。
然而,這樣的圖案是在多線程的世界裏,多個線程可完成的一個工作單元,然後遞增中央計數器來跟蹤線程的總的進展通常是有用的。互鎖的替代方法是使用Monitor.Enter(或C#中的鎖定關鍵字),這會相對較慢。
你的問題是非常模糊的。你要更詳細地解釋,你需要什麼。當然,你應該在這裏展示你已經嘗試過的東西。 – horgh
如果你只是加入而你是新的......我不會從多線程入手 –
增量並不是學習並行化的好選擇。選擇一個「尷尬並行」 CPU綁定的問題:那就是一個問題,你可以分割問題成許多碎片和獨立解決每個子問題,其中CPU將是majorly問題強調。例如,「計算Mandelbrot集合的圖片」的問題可以按照您的喜好細分;您可以在兩個線程中的每一個上執行一半圖像,或者在三個線程中的每一個上執行三分之一的圖像,依此類推。線程的數量應該等於空閒處理器的數量。 –