2012-01-06 4 views
-1

次の2つのプログラム(期待していた)のパフォーマンスの違いを確認しようとしています。しかし、私は違いがないと思う。これは正常ですか? WindowsのCore 2 DuoプロセッサM/C のVisual Studio上で実行されているイム2010 Express Editionの計算量の多いC#プログラムの利点はありませんか?

プログラム1(100の実行上で平均:824.11ミリ秒):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.Threading; 


namespace MultiThreading 
{ 
    class Program 
    { 
     public static Stopwatch stopwatch; 
     static void Main(string[] args) 
     { 
      stopwatch = new Stopwatch(); 
      stopwatch.Start(); 
      //Thread t = new Thread(WriteY); 
      //t.Start(); 
      for (int i = 0; i < 10000; i++) 
      { 
       Console.Write("x{0} ", i); 
      } 

      WriteY(); 

      Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds); 
      Console.ReadLine(); 
     } 

     static void WriteY() 
     { 
      for (int i = 0; i < 10000; i++) 
      { 
       Console.Write("y{0} ", i); 
      } 
      //Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds); 
      //Console.ReadLine(); 
     } 

プログラム2(平均100以上のラン:828.11ミリ):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.Threading; 


namespace MultiThreading 
{ 
    class Program 
    { 
     public static Stopwatch stopwatch; 
     static void Main(string[] args) 
     { 
      stopwatch = new Stopwatch(); 
      stopwatch.Start(); 
      Thread t = new Thread(WriteY); 
      t.Start(); 
      for (int i = 0; i < 10000; i++) 
      { 
       Console.Write("x{0} ", i); 
      } 

      //WriteY(); 

      Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds); 
      Console.ReadLine(); 
     } 

     static void WriteY() 
     { 
      for (int i = 0; i < 10000; i++) 
      { 
       Console.Write("y{0} ", i); 
      } 
      //Console.WriteLine("Time taken in milliseconds: {0}", stopwatch.ElapsedMilliseconds); 
      //Console.ReadLine(); 
     } 
    } 
} 
+2

-1。あなたはどんな計算もありません。したがって、「計算的に集中的」とは、これが意味する基本的な誤解です。 Isnteadはコンソール出力機構によってシリアル化されたConsole.WriteLine IOです。 – TomTom

答えて

8

私の推測では、両方のは、おそらく1つのスレッドだけの時間でそれをアクセスするようにリソース(画面)をロックする必要がConsole.Writeの速度に縛られることです。

+0

正確です。お互いにマングリングしていない異なるスレッドの文字列によって明らかです。 – TomTom

4

問題は、常にConsole.WriteLineを使用しているため、アプリケーションがIOバインドされていることです。あなたがIOを使用していない何かをするなら、あなたはブーストを見るでしょう。

そして、他の回答で述べたように WriteLineが実際に同期させるん: Calling Console.WriteLine from multiple threads

+0

'Console.WriteLine'がなければ、プログラムはほぼ確実に(ほぼ)終了し、2番目の例ではスレッドを回転させるのに費やすオーバーヘッドが増えます。私は最初のものが最初に終わると期待しています。もちろん、ループ本体がない場合、コンパイラはおそらく(リリースモードで)ループを省略し、スレッドをスピンアップするか、スレッドを回転させないかの基準にします。 – spender

+0

@spenderええ、それはすべて 'WriteLine'が何に置き換えられるかによって異なります。あなたが言うように、それが何にも置き換えられなければ、おそらく何も置き換えられません。しかし、それが大きな行列の乗算に置き換えられた場合、それらは実行時間の50%近くカットされるかもしれません(キャッシュなどに依存します) –

関連する問題