毎秒ビットを false に設定する bitarray を列挙します。
ここで、これを 2 つのスレッドに分割して速度を上げたいと思います..何らかの奇妙な理由で、半分の量の作業を行うスレッドあたりの時間は64% 以上の時間を要しますが、なぜでしょうか?
これは、ある種の CPU キャッシュ効果によるものでしょうか? これを正しく行うにはどうすればよいですか?
以前にラムダ式で8スレッドも試しましたが、常に約1400ミリ秒でしたが、シングルスレッドでは一貫して850ミリ秒になりました。また、1 つのスレッドにすべての作業を任せると、830 ミリ秒かかりました。よく分からないんだけど、ここの原因わかる人いますか?
コード:
class Program
{
static int count = 0x10000000;
static int half = count / 2;
static BitArray bitArray = new BitArray(count);
static unsafe void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
#if SINGLE
for (int i = 0; i < bitArray.Count; i += 2)
bitArray.Set(i, true);
#else
Thread thread1 = new Thread(Thread1);
Thread thread2 = new Thread(Thread2);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
#endif
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
static void Thread1()
{
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < half; i += 2)
bitArray.Set(i, true);
sw.Stop();
Console.WriteLine("Thread1: {0}", sw.ElapsedMilliseconds);
}
static void Thread2()
{
Stopwatch sw = Stopwatch.StartNew();
for (int i = half; i < count; i += 2)
bitArray.Set(i, true);
sw.Stop();
Console.WriteLine("Thread2: {0}", sw.ElapsedMilliseconds);
}
}