LINQ-2-SQL скомпилированные запросы.Поле против собственности? - PullRequest
1 голос
/ 17 ноября 2011

Недавно я превратил функцию LINQ-2-SQL в скомпилированный запрос, и я заметил несколько странное поведение с ним. Когда я сохраняю его как статическое поле, согласно каждому примеру, который я видел здесь и в остальной части сети, нагрузочное тестирование привязывает ЦП к 100% на все время теста. С другой стороны, когда я делаю это как статическое свойство, точно такой же сценарий нагрузочного тестирования колеблется в диапазоне 40-100%. Почему производительность намного лучше, чем собственность? У кого-нибудь есть идея? Насколько я могу судить, единственное различие между ними состоит в том, что поле занимает больше процессора, чем свойство.

Вот две версии:

    private static Func<WebDataContext, int, int, IEnumerable<Product>> GetProductsWithDecendentQuery
    {
        get
        {
            return CompiledQuery.Compile<WebDataContext, int, int, IEnumerable<Product>>((WebDataContext context, int left, int right) => 
                context.Taxonomies.Where(x => x.LeftNumber >= left && x.RightNumber <= right)
                .SelectMany(x => x.InventoryTaxonomies.Select(y => y.Product))
                .Distinct().Where(x => x.Status && (x.IsDropShip != true || x.Locations.Sum(y => y.Quantity) > 1))
            );
        }
    }

против

    private static Func<WebDataContext, int, int, IEnumerable<Product>> GetProductsWithDecendentQuery =
        CompiledQuery.Compile<WebDataContext, int, int, IEnumerable<Product>>((WebDataContext context, int left, int right) => 
                context.Taxonomies.Where(x => x.LeftNumber >= left && x.RightNumber <= right)
                .SelectMany(x => x.InventoryTaxonomies.Select(y => y.Product))
                .Distinct().Where(x => x.Status && (x.IsDropShip != true || x.Locations.Sum(y => y.Quantity) > 1))
            );

1 Ответ

1 голос
/ 17 ноября 2011

Я подозреваю, что выполняется какой-то другой ввод-вывод, который не зависит от ЦП от версии свойства, а не от полевой версии. Помимо загрузки процессора, у вас есть сравнение различий во времени между вариантами?

Когда LINQ to SQL был в бета-версии и CompiledQuery впервые был введен, по крайней мере, статические поля были рекомендованы частично, потому что компилятор мог обнаруживать их и оптимизировать части запроса во время компиляции, а не ждать времени выполнения, как это потребуется в случай собственности. Например, были утверждения, что компилятор может обнаруживать метаданные контекста и жестко кодировать установщики свойств, а не полагаться на подход отражения при гидратации объектов для скомпилированного запроса статического поля. Рико Мариани обсудил некоторые из этих оптимизаций на http://blogs.msdn.com/b/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx. Я не могу сказать, изменились ли / как эти оптимизации в последующих выпусках на данный момент, чтобы сказать наверняка, может ли это вызвать различия, которые вы видите.

...