私は基本的に2つの異なる配列(それぞれがピーク時に2〜4kのサイズを持つ)でルックアップし、これらの値に基づいて3番目の配列に値を設定するforループを2つ持っています。いくつかの奇妙な理由のために、コードのこの部分のパフォーマンスと、2つのループのための2つの順序とに依存する2つの違いがあります。パフォーマンスが向上するのはなぜですか?
これが最初の設定です。それは私のPC上〜150ミリ秒で実行されます。私はこの
for (int verticalIndex = 0; verticalIndex < a.Length; verticalIndex++)
{
for (int horizontalIndex = 0; horizontalIndex < b.Length; horizontalIndex++)
{
resultMatrix[a.Length + b.Length - 1 - verticalIndex - horizontalIndex, verticalIndex] = a[a.Length - verticalIndex - 1] * b[b.Length - horizontalIndex - 1];
}
}
様ループの順序が、何も変わらない場合
public static int[] SchoolMultiplication(int[] a, int[] b, int numberBase)
{
List<double> times = new List<double>();
TimeTest timeTest = new TimeTest();
int aLen = a.Length;
int bLen = b.Length;
int[,] resultMatrix = new int[a.Length + b.Length, aLen];
int[] result = new int[a.Length + b.Length];
timeTest.Start();
for (int horizontalIndex = 0; horizontalIndex < b.Length; horizontalIndex++)
{
for (int verticalIndex = 0; verticalIndex < a.Length; verticalIndex++)
{
resultMatrix[a.Length + b.Length - 1 - verticalIndex - horizontalIndex, verticalIndex] = a[a.Length - verticalIndex - 1] * b[b.Length - horizontalIndex - 1];
}
}
は今の方法の総運転時間は約〜400ミリ秒に低下します。単純なループ順序の交換は、パフォーマンスを約300%向上させますか?私はそれが何らかのキャッシュやポインタの性能のものだと思いますか?
ここをクリックしてください:http://stackoverflow.com/questions/997212/fastest-way-to-loop-through-a-2d-array –
'a'と' b'の長さはどのくらいですか? –
答えは、@Mike Danielsが提供したリンクのものです。これは非常によく知られたキャッシュ関連の問題/最適化の例です。 –