2016-11-30 55 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