Я обнаружил, что доступ к массиву Dictionary и Multi-Dimension может быть медленным - довольно головоломка, так как время доступа для словаря и массива - O(1)
.Доступ к словарю и многомерному массиву Slow
Это мой код
public struct StateSpace
{
public double q;
public double v;
public double a;
}
public class AccessTest
{
public Dictionary<int, Dictionary<double,StateSpace>> ModeStateSpace;
public double[,] eigenVectors;
public void AccessJob(int n, double times)
{
var sumDisplacement = new double[6];
for(int i=0; i< n; i++)
{
var modeDisplacement = ModeStateSpace[i][times].q; //takes 5.81 sec
for(int j=0; j<6; j++)
{
var eigenVector = eigenVectors[i, j]; //takes 5.69 sec
sumDisplacement[i] += eigenVector*modeDisplacement ; //takes 1.06 sec
}
}
}
}
Обратите внимание на интересное? Манипуляция занимает ~ 1 сек, но доступ к словарю и многомерному массиву занимает ~ 5 секунд! Любая идея, почему это так?
Здесь не важны n
, а также абсолютная величина времени, необходимого для каждой операции. Важным является соотношение между арифметической операцией и временем поиска словаря.
Редактировать: Я использую Ants Profiler для профилирования.
Примечание: Я просто упростил свой код в чем-то подобном; приведенный выше фрагмент кода еще не был протестирован, но я уверен, что я фиксирую суть проблемы с приведенным выше фрагментом кода.
Вы уверены, что это не разыменование, время? –
@ Митч, это C#, это не C, поэтому я не думаю о разыменовании вопросов. – Graviton
@ Ngu: он делает. Поисковая локальность ссылки –