Обновление: оказывается, отражение не должно быть медленным.Используйте Fasterflect (http://www.codeproject.com/Articles/38840/Fasterflect-a-fast-and-simple-API-for-Reflection-i). Это делает отражения буквально (и я имею в виду слово «буквально» в самом буквальном смысле, а не в переносном смысле, как это часто неправильно) в 100 раз быстрее.
Я получил свой код сейчасотметьте, что он загружает данные и помещает данные в мои бизнес-объекты так же быстро, как студия управления SQL-сервером может выполнить выборку * в таблицах.
Я только что запустил этот фрагмент кода, который проверяет любойтипов данных в моей таблице и использует соответствующие методы Get:
foreach (var p in obj.Properties)
{
object value;
var i = fieldNumbers[p.Alias];
if (p.Type == "System.Nullable`1[System.Int16]") value = dr.GetSqlInt16(i);
else if (p.Type == "System.Nullable`1[System.Int32]") value = dr.GetSqlInt32(i);
else if (p.Type == "System.Nullable`1[System.Decimal]") value = dr.GetSqlDecimal(i);
else if (p.Type == "System.Nullable`1[System.Boolean]") value = dr.GetSqlBoolean(i);
else if (p.Type == "System.String") value = dr.GetSqlString(i);
else if (p.Type == "System.Nullable`1[System.DateTime]") value = dr.GetSqlDateTime(i);
}
и это:
foreach (var p in obj.Properties)
{
object value;
var i = fieldNumbers[p.Alias];
value = dr[i];
}
и второй последовательно работает быстрее. Я был удивлен этим, но кажетсячтобы быть правдой. Может кто-нибудь сказать мне, если я пропускаю что-то здесь, потому что я видел, как несколько человек утверждают, что методы GetXXX работают лучше. Я рассчитал это в целом, а также время отдельных операций извлечения. Я действительно просто развенчал миф?
РЕДАКТИРОВАТЬ: После тестирования еще несколько я обнаружил пару вещей.
1-й - Это "немного" быстрее (примерно 8% для тестов, которые я выполнил), чтобы использовать метод get, который возвращает значение в строго типизированную переменную, и я проверил это без всего лишнего кода, описанного выше, чтобы не было никакой отправки или чего-то в этом роде ... просто яблоки яблокам.
Однако обратите внимание, что я использую функции GetSqlXXX, а не функции GetXXX.Это потому, что последний не может использоваться для нулевых значений.Тем не менее, первый возвращает типы, такие как SqlInt32, а не int ?.Мои поля не SqlXXX, хотя, это простые обнуляемые типы, такие как int ?.Я думаю, что это часто случается с большинством людей, что означает, что вы на самом деле не получаете увеличение скорости типизированных методов, если только вы не хотите начать работать с SqlTypes во всем вашем коде.
Во-вторых, язаметил, что получение нулевых значений кажется медленнее, чем вы ожидаете в целом ... но это, конечно, мое мнение.
РЕДАКТИРОВАТЬ 2: Только для Дуга МакКлина и TheEvilPenguin я рассчитал "просто" ветвление следующим образом:
Stopwatch sw = new Stopwatch();
long time = 0;
while (dr.Read())
{
var obj = new O();
obj.Initializing = true;
sw.Restart();
foreach (var p in obj.Properties)
{
if (p.Type == "System.Nullable`1[System.Int16]") continue;
else if (p.Type == "System.Nullable`1[System.Int32]") continue;
else if (p.Type == "System.Nullable`1[System.Decimal]") continue;
else if (p.Type == "System.Nullable`1[System.Boolean]") continue;
else if (p.Type == "System.String") continue;
}
time += sw.ElapsedTicks;
}
sw.Stop();
MessageBox.Show(time.ToString());
Мне пришлось оставить там пару строк, не относящихся к разветвлению, но вы можете видеть, что я только добавляю время вокруг разветвления.Сначала я делал это за миллисекунды, и результат (для записей около 60 тыс.) Был равен 1. Очевидно, что каждый цикл меньше миллисекунды, поэтому я переключился на тики, и результат составил 466472, что составляет менее 1 половины 1 миллисекунды (если я не получилмои десятичные знаки перепутали ... кто-нибудь, пожалуйста, поправьте меня, если я там).Так как дорого обходится ветвление?Нет.
На самом деле эти результаты кажутся ужасно маленькими, поэтому кто-то, пожалуйста, исправьте меня, если я допустил ошибку в своем тесте, но в любом случае ветвление - одна из самых дешевых вещей, которые вы можете сделать.