Скорость поиска строк / столбцов в DataSet? - PullRequest
6 голосов
/ 28 сентября 2008

В последнее время мне пришлось выполнять очень сложные операции с данными, хранящимися в наборе данных. Он был достаточно тяжелым, и в итоге я использовал инструмент, помогающий выявить некоторые узкие места в моем коде. Когда я анализировал узкие места, я заметил, что, хотя поиск в DataSet не был ужасно медленным (они не были узким местом), он был медленнее, чем я ожидал. Я всегда предполагал, что DataSets использует какую-то реализацию стиля HashTable, которая будет выполнять поиск O (1) (или, по крайней мере, это то, что я считаю HashTables). Скорость моих поисков оказалась значительно ниже этой.

Мне было интересно, если кто-нибудь, кто знает что-либо о реализации класса .NET DataSet, захочет поделиться тем, что он знает.

Если я сделаю что-то вроде этого:

DataTable dt = new DataTable();
if(dt.Columns.Contains("SomeColumn"))
{
    object o = dt.Rows[0]["SomeColumn"];
}

Насколько быстрым будет время поиска для метода Contains(...) и для извлечения значения для хранения в Object o? Я бы подумал, что это будет очень быстро, как HashTable (при условии, что я понимаю о HashTables правильно), но это не похоже на это ...

Я написал этот код из памяти, поэтому некоторые вещи могут не быть «синтаксически правильными».

Ответы [ 4 ]

3 голосов
/ 28 сентября 2008

На самом деле рекомендуется использовать целое число при обращении к столбцу, что может значительно улучшить производительность. Для удобства управления вы можете объявить постоянное целое число. Таким образом, вместо того, что вы сделали, вы могли бы сделать

const int SomeTable_SomeColumn = 0;

DataTable dt = new DataTable();
if(dt.Columns.Contains(SomeTable_SomeColumn))
{
    object o = dt.Rows[0][SomeTable_SomeColumn];
}
2 голосов
/ 29 октября 2008

Через Отражатель шаги для DataRow ["ColumnName"]:

  1. Получить DataColumn из ColumnName. Использует строку DataColumnCollection ["ColumnName"]. Внутренне DataColumnCollection хранит свои DataColumns в Hastable. O (1)
  2. Получить индекс строки DataRow. Индекс хранится во внутреннем члене. O (1)
  3. Получить значение DataColumn в индексе, используя DataColumn [index]. DataColumn хранит свои данные в элементе System.Data.Common.DataStorage (внутренний, абстрактный):

    вернуть dataColumnInstance._storage.Get (recordIndex);

    Пример конкретной реализации - System.Data.Common.StringStorage (внутренний, герметичный). StringStorage (и другие конкретные проверенные DataStorages) хранят их значения в массиве. Get (recordIndex) просто захватывает объект в массиве значений в recordIndex. O (1)

Итак, в целом вы O (1), но это не значит, что хеширование и вызов функции во время операции бесплатны. Это просто означает, что это не будет стоить дороже, так как число DataRows или DataColumns увеличивается.

Интересно, что DataStorage использует массив для значений. Не могу представить, что его легко перестроить при добавлении или удалении строк.

0 голосов
/ 28 сентября 2008

На самом деле, я считаю, что имена столбцов хранятся в Hashtable. Должен быть O (1) или постоянный поиск для поиска с учетом регистра. Если бы ему пришлось просматривать каждый, то, конечно, это было бы O (n).

0 голосов
/ 28 сентября 2008

Я полагаю, что любые поиски были бы O (n), так как я не думаю, что они использовали бы какой-либо тип хеш-таблицы, но фактически использовали бы больше массива для поиска строк и столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...