2015-04-12 48 views
3

我想在BigInteger變量上進行計算,然後將結果添加到數據庫中。獲得循環的最大性能

發生什麼事是某事像這樣:

  for (BigInteger i = 0; i < ABigIntegerVariable; i++) 
     { 
      // add to db and calculate on a BigInteger 
     } 

所以,問題是,當我看到在任務管理器的CPU使用率也只有約8%! 和這個循環需要約1小時或更多!

因此,當我試圖計算並添加到數據庫時,沒有必要使用計算機。

您是否會告訴我如何使用高比例計算的CPU,並改進此過程以獲得更快的計算?

謝謝

+1

?你有沒有聯繫過它? – Jibbow

+1

你如何「添加到數據庫」?我認爲主要的瓶頸是你的進程和sql server(或任何)之間的延遲和IPC。怎麼樣批量添加項目到數據庫?這將顯着提高性能。 –

+2

@SriramSakthivel +1耶!謝謝你......這是一個好方法。我測試它 –

回答

8

這是多種原因:

。你的for循環運行在單線程上,
。您在每次迭代中將數據插入數據庫中,而不是在循環處理完成後批量處理數據。

提出的解決方案

。您可以嘗試使用Parallel.For方法加快。 的原因。

實施例:https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx

。您可以將負責保存for循環中的數據的代碼移出,以加速。原因。

+2

是啊!謝謝你,這很有趣! –

2

您可以使用任務/線程,如果循環內的代碼可以什麼多線程併發運行

 for (BigInteger i = 0; i < ABigIntegerVariable; i++) 
     { 
      Thread thread= new Thread(m => 
      { 
       //TODO: do something spectacular with i 
      }); 
      thread.Start(i); 
     } 
+0

由於BigInteger由FW4引入,我們可以假設OP使用FW 4.因此,而不是Thread,他也可以使用TPL的任務。它可以更好地管理線程。因爲依賴於ABigIntegerVariable,您的提議可能會導致潛在的非常巨大的線程數;) – AFract