2016-11-30 31 views
1

爲了比較並行和串行計算模式下的運行時間,我將小寫字母轉換爲大寫字母。對於並行模式,我運行2個線程並獲得運行時間。 現在並行運行時間大於串行。 我的代碼有什麼問題?並行編程代碼c#和運行時間

public void thread1() 
    { 

     for (int k = 0; k < Len; k = k + 2) 
     { 
      string sr1 =chars[k].ToString(); 
      pchars[k] = sr1.ToUpper(); 
     } 
    } 
    public void thread2() 
    { 
     for (int q = 1; q < Len; q = q + 2) 
     { 
      string sr2 = chars[q].ToString(); 
      pchars[q] = sr2.ToUpper(); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     read_array(); 
     var time2 = Stopwatch.StartNew(); 
     Thread t1 = new Thread(new ThreadStart(thread1)); 
     Thread t2 = new Thread(new ThreadStart(thread2)); 
     t1.Start(); 
     t2.Start(); 
     time2.Stop(); 
     lbl1.Text = (time2.Elapsed.TotalMilliseconds).ToString("ms"); 
     Thread.Sleep(1); 

    } 



} 
+3

簡而言之:平行並不總是更快。創建和維護多個線程會產生一些開銷成本(並且在小規模任務中尤其明顯)。 –

回答

1

幾個點這裏:首先,作爲DangerZone在評論中指出,添加線程具有一些開銷,所以你需要確保你的線程上做什麼其實是CPU密集型足夠的理由線程的開銷。在這種情況下,它看起來不是。

其次,下面的測試是完全無效:

var time2 = Stopwatch.StartNew(); 
    Thread t1 = new Thread(new ThreadStart(thread1)); 
    Thread t2 = new Thread(new ThreadStart(thread2)); 
    t1.Start(); 
    t2.Start(); 
    time2.Stop(); 

所有你實際測量這裏是需要多長時間來創建和啓動線程,它實際上並不需要多長時間才能完成的任務線程實際上正在運行。第三,對於這種「一次性」任務,你只需要做一次然後扔掉它,你可能想要使用Task.Run或線程池。

+0

感謝您的關注。我改變了代碼並在線程方法中計算時間,現在並行運行時間比串行計算小得多。 – hagard

+0

public void thread1() { time2 = Stopwatch.StartNew();對於(int k = 0; k hagard

+0

是這種方法(使用線程方法)正確的並行計算? – hagard