Что быстро: запрос синтаксиса против циклов - PullRequest
4 голосов
/ 20 января 2011

Следующий код предоставляет два подхода, которые генерируют пары целых чисел, сумма которых меньше 100, и они располагаются в порядке убывания на основе их расстояния от (0,0).

    //approach 1
    private static IEnumerable<Tuple<int,int>>  ProduceIndices3()
    {
        var storage = new List<Tuple<int, int>>();
        for (int x = 0; x < 100; x++)
        {
            for (int y = 0; y < 100; y++)
            {
                if (x + y < 100)
                    storage.Add(Tuple.Create(x, y));
            }
        }
        storage.Sort((p1,p2) =>
           (p2.Item1 * p2.Item1 + 
           p2.Item2 * p2.Item2).CompareTo(
           p1.Item1 * p1.Item1 +
           p1.Item2 * p1.Item2));
        return storage;
    }

    //approach 2
    private static IEnumerable<Tuple<int, int>> QueryIndices3()
    {
        return from x in Enumerable.Range(0, 100)
               from y in Enumerable.Range(0, 100)
               where x + y < 100
               orderby (x * x + y * y) descending
               select Tuple.Create(x, y);
    }

Этот код взят из книги Effective C # Билла Вагнера, пункт 8. Во всей статье автор уделил больше внимания синтаксису, компактности и удобочитаемости кода, но заплатил очень мало внимания уделяли спектаклю и почти не обсуждали его.

Итак, я хочу знать, какой подход быстрее? А что обычно лучше в производительности (в целом): синтаксис запросов или циклические операции?

Пожалуйста, обсудите их подробно, предоставив ссылки, если таковые имеются. : -)

Ответы [ 3 ]

9 голосов
/ 20 января 2011

Профилирование - это правда, но мое интуитивное чувство было бы, что петли, вероятно, быстрее. Важно то, что в 99 раз из 100 разница в производительности не имеет значения в общей схеме. Используйте более читабельную версию, и ваше будущее Я будет вам благодарно, когда вам понадобится поддерживать ее позже.

4 голосов
/ 20 января 2011

Запуск каждой функции 1000 раз:

для цикла: 2623 мс запрос: 2821 мс

выглядит логично, так как второй - просто синтаксический сахар для первого. Но я бы использовал второй для его читабельности.

1 голос
/ 20 января 2011

Хотя это не совсем отвечает на ваш вопрос, в плане производительности я бы предложил объединить эту логику x + y в итерации, таким образом:

for (int x = 0; x < 100; x++)
    for (int y = 0; y < 100 - x; y++)
        storage.Add(Tuple.Create(x, y));
...