2010-10-22 4 views
1

Я обнаружил, что доступ к массиву 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 для профилирования.

Примечание: Я просто упростил свой код в чем-то подобном; приведенный выше фрагмент кода еще не был протестирован, но я уверен, что я фиксирую суть проблемы с приведенным выше фрагментом кода.

+0

Вы уверены, что это не разыменование, время? –

+0

@ Митч, это C#, это не C, поэтому я не думаю о разыменовании вопросов. – Graviton

+0

@ Ngu: он делает. Поисковая локальность ссылки –

ответ

1

Это известный факт, что неровные массивы быстрее, чем многомерные массивы в .NET (по крайней мере, на окнах):

Смежные вопросы