2013-06-07 4 views
3

Я знаю, что DataTable использует бокс/распаковку, когда мы вставляем/получаем данные. Если у нас есть действительно большой объем данных, содержащих только int, не быстрее ли использовать какой-то общий DataTable, скажем MyDataTable<int>, что приведет к недопущению накладных расходов на бокс/разборку?C# DataTable vs Некоторая общая производительность коллекции

ответ

2

Основная проблема, с которой вам придется иметь дело, состоит в том, что DataTable может иметь любое количество столбцов, в которых каждый столбец может быть любого типа. Вы не можете обобщать его, сохраняя при этом разные типы для каждого столбца.

Один из способов избежать бокса - вместо использования DataTable создать объект для представления каждой строки. Убедитесь, что объект имеет свойство для каждого столбца соответствующего типа. Затем вы можете работать с List (или некоторой другой структурой данных) этих объектов.

Другой вариант, если у вас есть, например, целиком int значения для ваших данных, было бы создание многомерного массива ints (int[,] mydata = new int[10000,5];). Это также позволило бы избежать бокса целых чисел.

3

Строки являются ссылочными типами, поэтому нет накладных расходов на бокс: они никогда не помещаются в коробку. Однако у DataTable есть много накладных расходов - это затраты на возможность представления произвольных моделей столбцов наряду с ограничениями, отслеживанием изменений и т. Д. Для достижения оптимальной производительности модель POCO трудно превзойти. Например:

public class Customer { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // ... 
} 

Есть много ORMs и микро-ORMs, которые делают работу с этим типом модели.

Обратите внимание, что в DataTable значения хранятся в в правильно типизированных массивах. Инты хранятся в int [] - это происходит путем хранения данных в столбцах, а не в строках. Бокс происходит только при получении данных в/из DataTable.

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