Что быстрее?Цикл по свойствам объекта или запрос linq? - PullRequest
3 голосов
/ 15 июля 2011

Это быстрее

var query = from prop in object.GetType().GetProperties()
            where prop.Name == "Id"
            select prop;

var singleProperty = query.SingleOrDefault();
//do stuff with singleProperty

чем это?

var type = object.GetType();
foreach(var prop in type.GetProperties())
{
  if(prop.Name == "Id")
   {
     //do stuff
   }
}

Другой путь? Или они одинаковые?
Почему и как ты узнал?

Извините за чрезмерную прямолинейность в моем вопросе. Я предпочитаю первый, но я не знаю, почему или если я должен.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

Технически, первый случай может выделить больше памяти и выполнить больше обработки для генерации окончательного результата, чем второй случай из-за промежуточных данных и абстракций LINQ.Но количество времени и памяти настолько незначительно, что вы гораздо лучше делаете свой код более читабельным, чем самым эффективным для этого сценария.Вероятно, это случай преждевременной оптимизации.

Вот некоторые ссылки, почему первый может быть немного медленнее:

  1. http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html
  2. http://ox.no/posts/linq-vs-loop-a-performance-test
  3. http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/23/c-linq-vs-foreach---round-1.aspx
1 голос
/ 15 июля 2011

Правильный ответ: используйте Reflector, чтобы увидеть, что генерируется компилятором.

Тем не менее, ваш запрос LINQ использует тот же механизм для получения списка свойств, что и ваш другой фрагмент. Технически это должно быть быстрее без использования накладных расходов linq. Тем не менее, я ожидаю, что разница будет минимальной (т.е. непостижимой), так что это действительно сводится к решению о читабельности и удобстве сопровождения кода.

И я ненавижу LINQ, так что пропустите его.

Ретроспектива, год спустя :

Я обнаружил, что LINQ - это не тот демон, о котором я думал. Я на самом деле очень впечатлен его реализацией и потратил немало времени, глядя на IL, пытаясь найти законную причину, чтобы не нравиться. Тем не менее, LINQ-to-объектов довольно гладко. Тем не менее, будущие поколения работают над проектами с базой данных: не используйте это в качестве причины для выполнения всех ваших запросов на клиенте, вместо того, чтобы позволить вашему серверу баз данных делать то, что он очень, очень хорош.

0 голосов
/ 15 июля 2011

Они одинаковы с точки зрения производительности, поскольку LINQ использует отложенное выполнение . Тем не менее, тривиально (и не имеет значения) больший объем памяти может перейти в опцию LINQ.

Следовательно, они (эффективно) идентичны по производительности и поведению!

Я бы пошел с версией LINQ для удобочитаемости, потому что мне нравится LINQ, но каждому свой.

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