2017-01-11 11 views
0

私はC#のいくつかのプログラムを練習しています。私はこのプログラムに問題があります。C#プログラムは複数のインスタンスでゆっくり実行されます

私はこのプログラムを作成しました。実行には21秒かかり、CPU使用率は20%、RAM使用量は1Gbです。

 static void Main(string[] args) 
    { 
     string str = Console.ReadLine(); 

     if (str == "start") 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      for (int i = 1; i < 200000; i++) 
      { 


       Console.WriteLine("Acccessed Value" + i.ToString()); 
       Console.WriteLine("Time " + sw.ElapsedMilliseconds); 

      } 
     } 
     Console.Read(); 
    } 

しかし、私がこの2つのインスタンスを作成すると、140秒かかり、CPU使用率は20%、RAM使用率は最大1GBです。

私は21秒かかるが、私のRAMとCPUを最大限に活用できる複数のインスタンスを実行するにはどうすれば助けてくれますか?

+0

http://stackoverflow.com/a/19027941/2026276 – Bauss

+3

*ポイントは何ですか*このプログラムの? –

+0

これをコンソールに書き込んでも、すべてのCPUが消費されるわけではありません。すべてのコアで 'while(true);'を試してください。 –

答えて

1

異なるインスタンスを開始する必要はありません。ご使用のアプリケーションでTaskを使用して、CPUの複数のコアを利用してください。 Environment.ProcessorCount個のタスクを作成し、その上で操作を実行します。より高いレベルの抽象化もあります - Parallel、あなたが調べることができます。

+0

このプログラムの主な作業を除いて、コンソールに出力するだけです。プロセス内で余分なコピーを実行すると、コンソールへのアクセスがロックされるため、処理が遅くなります。私たちは実際の作業がユーザーが作業していることを知らないので、リソースが自然にリソースに制約されているか(コンソールとして)、追加のタスクが役立つかどうかはわかりません。 –

+0

私はこのコードでこれを試しました。私が1つのタスクを実行する場合は21秒、2つのタスクではそれぞれ43秒かかります。ここにコードがあります:Task _task = new Task(()=> GetTest()); タスク_tasknew =新しいタスク(()=> GetTest1()); _task.Start(); _tasknew.Start(); –

0

Console.WriteLineメソッドはIOメソッドであり、マルチスレッド操作(see here)ではうまく拡張されず、非同期操作はサポートされません。だから、あなたはこれを支配しない可能性が高いです。

しかし、質問には本当にそのようなアプリケーションが必要ですか?私はそうは思わない;一度に出力するためにその量のテキストを書きたいとは思っていません。非同期操作をサポートする、おそらくファイルへの書き込み。簡単な改良として

次のように、あなたの代わりに、多くの短命Stringオブジェクトを作成するのStringBuilderを使用することができますが:

static void Main(string[] args) 
{ 
    string str = Console.ReadLine(); 

    if (str == "start") 
    { 
     Stopwatch sw = new Stopwatch(); 

     var builder = new StringBuilder(); 

     for (int i = 1; i < 200000; i++) 
     { 
      sw.Start(); 

      builder.Clear(); 
      string a = builder.Append("Acccessed Value").Append(i.ToString()).ToString(); 

      builder.Clear(); 
      string b = builder.Append("Time ").Append(sw.ElapsedMilliseconds); 

      Console.WriteLine(a); 
      Console.WriteLine(b); 

     } 
    } 
    Console.Read(); 
} 
+0

上記のコードに時間差はありません。 –

+0

@Coding_hell、 'Console.WriteLine'なしで試してみてください。特に、端末に出力するIO操作には時間がかかり、マルチスレッドコードでもこれを回避することはできません。後ろの路地でフェラーリを運転するようなものです。実際のトラックと同じように演奏することはできません。 –

関連する問題