簡體   English   中英

LINQ-2-SQL編譯查詢。 領域還是財產?

[英]LINQ-2-SQL Compiled Queries. Field vs Property?

我最近將LINQ-2-SQL函數轉換為已編譯的查詢,並且注意到它的一些非常奇怪的行為。 當我將其存儲為靜態字段時(根據我在此處和在Web其余部分上看到的每個示例),負載測試會將CPU在整個測試過程中固定為100%。 另一方面,當我將其作為靜態屬性執行時,完全相同的負載測試腳本會在40-100%的范圍內波動。 為什么性能要比性能好得多? 有人有主意嗎? 據我所知,它們之間的唯一區別是該字段占用的CPU比該屬性占用的CPU多。

這是兩個版本:

    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))
            );

我懷疑還有其他正在執行的IO,這些IO不取決於屬性版本,而取決於字段版本。 除了CPU利用率以外,您是否還可以比較兩個選項之間的時序差異?

當LINQ to SQL在Beta中並且至少首次引入CompiledQuery時,建議使用靜態字段,部分原因是編譯器可以在編譯時檢測到它們並優化查詢的某些部分,而不必等到運行時才需要財產。 例如,有人聲稱編譯器可以檢測上下文的元數據並對屬性設置器進行硬編碼,而不是在為靜態字段編譯的查詢補水對象時依賴於反射方法。 Rico Mariani在http://blogs.msdn.com/b/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx上討論了其中的一些優化。 我不能說這些優化是否/如何在隨后的發行版中更改,以便確定是否會導致您所看到的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM