現在、2 つの配列を比較し、それらが等しいかどうかを判断するための for ループがあります。
public override bool Equals(object obj)
{
RushHourPathLengthNode otherNode = (RushHourPathLengthNode)obj;
// Compare their carCoords and return false as soon as we find a difference
for (int i = 0, l = carCoords.Length; i < l; ++i)
if (carCoords[i].x != otherNode.carCoords[i].x || carCoords[i].y != otherNode.carCoords[i].y)
return false;
return true;
}
これはうまくいきますが、私のプログラムの中で最も遅い部分の 1 つです。このように、テストケースの計算には約 7 秒かかります。
50K のタスクを実行している可能性がありますが、CPU 使用率は i7 860 CPU (4 コア、8 スレッド) で約 50% でした。
私の考えは、並列 for ループを使用して CPU 使用率を最大化し、これを高速化することでした。これが私が思いついたものです。
public override bool Equals(object obj)
{
RushHourPathLengthNode otherNode = (RushHourPathLengthNode)obj;
bool result = true;
Parallel.For(0, carCoords.Length, (i, loopState) =>{
if (!result)
loopState.Stop();
if (carCoords[i].x != otherNode.carCoords[i].x || carCoords[i].y != otherNode.carCoords[i].y)
result = false;
});
return result;
}
私には、これは並行して実行しようとし、loopState.Stop のために違いが見つかるとすぐに作業を停止するように見えます。このように CPU 使用率は 90% 以上ですが、テストケースの計算には約 35 秒かかり、その理由がわかりません。
私の実装に何か問題がありますか、それとも私のアプローチ全体が間違っていますか?
編集: carCoords.Length は 2 と +-100 の間の値になります。これを並行して行うことを正当化するには、その値が低すぎるようです。