さて、スレッドを使い始めたばかりですが、概念に頭を悩ませるのに少し時間がかかるので、20000行を印刷するのがどれだけ速くなるかを確認するために、非常に簡単なテストを作成しました(そしてクアッドコアプロセッサを使用しているので、より高速になると思いましたか?)
だから最初に私はこれを書いた(これは私が通常次のことをする方法です):
System.DateTime startdate = DateTime.Now;
for (int i = 0; i < 10000; ++i)
{
Console.WriteLine("Producing " + i);
Console.WriteLine("\t\t\t\tConsuming " + i);
}
System.DateTime endtime = DateTime.Now;
Console.WriteLine(a.startdate.Second + ":" + a.startdate.Millisecond + " to " + endtime.Second + ":" + endtime.Millisecond);
そして、スレッディングで:
public class Test
{
static ProducerConsumer queue;
public System.DateTime startdate = DateTime.Now;
static void Main()
{
queue = new ProducerConsumer();
new Thread(new ThreadStart(ConsumerJob)).Start();
for (int i = 0; i < 10000; i++)
{
Console.WriteLine("Producing {0}", i);
queue.Produce(i);
}
Test a = new Test();
}
static void ConsumerJob()
{
Test a = new Test();
for (int i = 0; i < 10000; i++)
{
object o = queue.Consume();
Console.WriteLine("\t\t\t\tConsuming {0}", o);
}
System.DateTime endtime = DateTime.Now;
Console.WriteLine(a.startdate.Second + ":" + a.startdate.Millisecond + " to " + endtime.Second + ":" + endtime.Millisecond);
}
}
public class ProducerConsumer
{
readonly object listLock = new object();
Queue queue = new Queue();
public void Produce(object o)
{
lock (listLock)
{
queue.Enqueue(o);
Monitor.Pulse(listLock);
}
}
public object Consume()
{
lock (listLock)
{
while (queue.Count == 0)
{
Monitor.Wait(listLock);
}
return queue.Dequeue();
}
}
}
さて、何らかの理由でこれはより速いと思いましたが、15回テストした後、結果の中央値は...数ミリ秒異なり、非スレッド化が優先されます
それから私はちょっと考えました...多分私は百万のConsole.WriteLineでそれを試すべきです、しかし結果は同様でした
私は何か間違ったことをしていますか?