Я заметил большую разницу во времени, необходимого для итерации одного списка измерений против 3-мерного списка, даже если количество итераций одинаково.
Кажется, что итерация трехмерного списка занимает 10 раз до тех пор, пока существует одномерный список, и мне интересно, почему это происходит, потому что мне обычно нужно иметь данные в трехмерном списке
Можно ли как-то обойти это, используя списки измерений, как я?
Пример реального мира точно такой же, как этот пример ниже:
Итерации: 9256408 занял 116 миллисекунд (с использованием одномерного списка с benchmark1)
Итерации: 9256408 заняло 1199 миллисекунд (с использованием трехмерного списка измерений с эталоном 2)
new Thread(testbenchmark1).Start(); //Single List
new Thread(testbenchmark2).Start(); //3D List
void testbenchmark1()
{
double a = 0; double b = 0; double c = 0; double d = 0; List<String> baseLIST = new List<String>(); List<int> valueLIST = new List<int>();
List<List<int>> valueLIST2D = new List<List<int>>(); int iterations = 0;
for (int i = 0; i < 56; i++)
{
baseLIST.Add(i.ToString());
}
for (int i = 0; i < 165293; i++)
{
valueLIST.Add(1);
}
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < baseLIST.Count; i++) //56
{
//Now calculate the GINI index for this feature
a = 0; b = 0; c = 0; d = 0;
for (int t = 0; t < valueLIST.Count; t++) //165293
{
a += 1;
b += 1;
c += 1;
d += 1;
iterations++;
}
}
stopWatch.Stop();
MessageBox.Show("Iterations: " + iterations + " took " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds");
}
void testbenchmark2()
{
double a = 0; double b = 0; double c = 0; double d = 0; List<String> baseLIST = new List<String>();
List<List<List<int>>> valueLIST3D = new List<List<List<int>>>(); int iterations = 0;
for (int i = 0; i < 56; i++)
{
baseLIST.Add(i.ToString());
valueLIST3D.Add(new List<List<int>>());
for (int i2 = 0; i2 < 165293; i2++)
{
List<int> valueLIST = new List<int>(); for (int n = 0; n < 4; n++) { valueLIST.Add(0); }
valueLIST3D[valueLIST3D.Count - 1].Add(valueLIST);
}
}
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < baseLIST.Count; i++) //56
{
//Now calculate the GINI index for this feature
a = 0; b = 0; c = 0; d = 0;
for (int t = 0; t < valueLIST3D[i].Count; t++) //165293
{
a += valueLIST3D[i][t][0];
b += valueLIST3D[i][t][1];
c += valueLIST3D[i][t][2];
d += valueLIST3D[i][t][3];
iterations++;
}
}
stopWatch.Stop();
MessageBox.Show("Iterations: " + iterations + " took " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds");
}