【C#】多執行緒 (Multi Thread) 最佳效率及執行緒數量測試比較

前言:

  記得那時剛學會多執行緒時,覺得很厲害!但這也讓我心中冒出了一個疑問,使用速度多執行緒會比較快嗎? 如果我是多核心,他是否使用多核心運作呢?因此撰寫此篇文章來進行解答。

前置作業:

硬體規格:

CPU:  i5-4460(4核心)
RAM:16G

效率測試:

單執行緒程式碼

  這段程式碼是讓電腦印出 500 個 “.” ,並計算執行時間。
  為了讓實驗結果較為正確,再用 For 迴圈執行程式 1000 次,並取出平均值。

static void Main (string[] args)
{
    List<double> kTimeList = new List<double> ();
    for (int i = 0; i < 1000; i++)
    {
        Stopwatch timer = new Stopwatch ();
        timer.Start ();
        for (int j = 0; j < 500; j++)
            Console.Write (".");

            timer.Stop ();

            TimeSpan ts = timer.Elapsed;
            kTimeList.Add (ts.TotalMilliseconds);
    }
    Console.WriteLine ();

    int nCount = 0;
    double dSumTime = 0;
    foreach (double d in kTimeList)
    {
        nCount++;
        Console.WriteLine ("[" + nCount + "]RunTime: " + d);
        dSumTime += d;
    }
    Console.WriteLine ("Average Time: " + dSumTime / nCount);
    Console.ReadLine ();
}

結果:

Average Time: 14.9138051

多執行緒程式碼

  這段程式碼採用 5 個執行緒,一樣印出 500 個點做測試。

static void Main (string[] args)
{
    List<double> kTimeList = new List<double> ();
    for (int i = 0; i < 1000; i++)
    {
        int nThreadCount = 5, nRunTimes = 500;
        List<Thread> tThreadList = new List<Thread>();
        Stopwatch timer = new Stopwatch ();
        timer.Start ();

        for (int j=0;j< nThreadCount; j++)
        {
            Thread t = new Thread (TestFunction);
            t.Start (nRunTimes / nThreadCount);
            tThreadList.Add (t);
        }
        foreach (Thread t in tThreadList)
        {
            t.Join ();
        }

        timer.Stop ();

        TimeSpan ts = timer.Elapsed;
        kTimeList.Add (ts.TotalMilliseconds);
    }
    Console.WriteLine ();

    int nCount = 0;
    double dSumTime = 0;
    foreach (double d in kTimeList)
    {
        nCount++;
        Console.WriteLine ("[" + nCount + "]RunTime: " + d);
        dSumTime += d;
    }
    Console.WriteLine ("Average Time: " + dSumTime / nCount);
    Console.ReadLine ();
}

static void TestFunction (object nCount)
{
    for (int i =0;i < (int)nCount; i++)
    {
        Console.Write (".");
    }
}

“5個執行緒執行” 結果:

Average Time: 56.9607147000001

  由於兩個程式碼不一樣,比較出來可能有落差,因此本人決定統一使用多執行緒程式碼,並設定建立幾個執行緒。

“1個執行緒執行” 結果:

Average Time: 18.1988104

測試結果:

  以下數值皆為 “執行1000次” 的 “平均毫秒”

\ “.”數量
 \
執行緒數 \
5001000100001000001000000
118.0837.70235.471401.023586.39
224.3142.30322.311410.145210.86
452.2770.13403.081436.865894.53
558.1376.92435.031466.906675.36
1078.62116.71506.111531.937381.53

總結:

  從上述實驗,在簡單的程式碼中,使用多執行緒,並不會提高執行速度,反而會拖慢效能原因在執行緒切換,也是需要時間的!

  但根據查資料的結果,再本身就會等待某事件處理完才能執行的程式碼中,例如:爬蟲網路傳輸,使用多執行緒反而可以提升效率!

  並且根據我的經驗,多執行緒應用時機,除了在爬蟲、網路傳輸,還有需要兩不同事件同時處理,例如:在輸入時,仍然會印Log。類似這種時機,也是可以應用多執行緒,來解決強制等待問題!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

four × 1 =