Hi anh em, chúc mọi người một ngày làm việc hiệu quả và đây năng lượng. Hôm nay mình sẽ nói về một số kinh nghiệm của mình khi làm việc với LINQ C#.
Không để anh em chờ lâu, cùng bắt đầu vào bài viết nào. Bài viết này mình sẽ nói các tool để theo dõi performance khi sử dụng linq và một số lưu ý về việc viết linq trong C#.
1. Source code Linq của Microsoft
- Github: https://github.com/microsoft/referencesource/tree/master/System.Core/System/Linq
- Anh em có thể vào đọc để hiểu thêm cách linq hoạt động và code c# của các method linq.
Ví dụ: ta có thể xem method Count() viết như thế nào
2. Một số tool để monitor performance khi sử dụng linq
- SQL Server Profiler: Cho phép ghi lại và phân tích câu truy vấn được tạo ra từ Linq
- LINQPad: https://www.linqpad.net/ một công cụ giúp viết và test linq query, phân tích performance và thời gian execute của query.
- Stopwatch class: Đo thời gian chạy trước và sau khi query thực thi.
- BenchMark Dotnet: cho phép so sánh thời gian chạy giữa nhiều function. https://github.com/dotnet/BenchmarkDotNet
3. Sử dụng IQueryable thay cho IEnumerable
- Iqueryable cho phép build query và execute query dựa trên database thay vì thực thi trên memory nếu sử dụng IEnumerable. Điều này giúp cải thiện performance khi query với data lớn.
Ví dụ:
- Ta có list chứa 1000000 customer và ta so sánh peformance khi sử dụng IQueryable và IEnumerable
1 2 3 4 5 6 | <span class="token class-name"><span class="token keyword">var</span></span> customers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">List<span class="token punctuation"><</span>Customer<span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> customers<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">Customer</span> <span class="token punctuation">{</span> FirstName <span class="token operator">=</span> <span class="token interpolation-string"><span class="token string">$"First</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">i</span><span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">,</span> LastName <span class="token operator">=</span> <span class="token interpolation-string"><span class="token string">$"Last</span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">i</span><span class="token punctuation">}</span></span><span class="token string">"</span></span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token comment">//Sử dụng IEnumerable </span> <span class="token class-name"><span class="token keyword">var</span></span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> results <span class="token operator">=</span> customers<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName<span class="token punctuation">.</span><span class="token function">StartsWith</span><span class="token punctuation">(</span><span class="token string">"S"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"IEnumerable took </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string">ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Sử dụng IQueryable </span> stopwatch<span class="token punctuation">.</span><span class="token function">Restart</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> results2 <span class="token operator">=</span> customers<span class="token punctuation">.</span><span class="token function">AsQueryable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName<span class="token punctuation">.</span><span class="token function">StartsWith</span><span class="token punctuation">(</span><span class="token string">"S"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"IQueryable took </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string">ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
**=> Kết quả: **
1 2 3 | IEnumerable took 256ms IQueryable took 24ms |
4. Sử dụng method syntax thay vì query syntax
- Sử dụng method syntax nhanh hơn query syntax bởi vì query syntax sẽ được C# compiler chuyển đổi thành method syntax trước khi nó thực thi.
- Tuy nhiên performance giữa method syntax và query syntax không đáng kể, nhưng best practice khi làm việc với linq là sử dung method syntax đặc biệt với lượng data lớn.
Ví dụ:
- Ta có list 1000000 orders
1 2 3 4 5 6 7 | <span class="token class-name"><span class="token keyword">var</span></span> orders <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">List<span class="token punctuation"><</span>Order<span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> orders<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">Order</span> <span class="token punctuation">{</span> Total <span class="token operator">=</span> i <span class="token operator">*</span> <span class="token number">0.01m</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token class-name"><span class="token keyword">var</span></span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Query syntax</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> querySyntaxResult <span class="token operator">=</span> <span class="token keyword">from</span> o <span class="token keyword">in</span> orders <span class="token keyword">where</span> <span class="token class-name">o</span><span class="token punctuation">.</span>Total <span class="token operator">></span> <span class="token number">1000</span> <span class="token keyword">select</span> o<span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Query syntax took </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string">ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Method syntax</span> stopwatch<span class="token punctuation">.</span><span class="token function">Restart</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> methodSyntaxResult <span class="token operator">=</span> orders<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>o <span class="token operator">=></span> o<span class="token punctuation">.</span>Total <span class="token operator">></span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Method syntax took </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string">ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
=> Kết quả:
1 2 3 4 | Query syntax took 71ms Method syntax took 6ms |
5. Cẩn thận khi sử dụng GroupBy
- Group by tốn rất nhiều chi phí nên nếu ta lạm dụng có thể làm cho performance không tốt.
Ví dụ:
- Ta có một list orders của các customers và mỗi customer có thể có ít nhất 1 order. Yêu cầu: lấy ra tổng số lượng order của mỗi customer.
- Ta sẽ viết theo 2 cách và dùng benchMark để so sánh performance:
1 2 3 4 5 | <span class="token comment">//Group by query</span> <span class="token class-name"><span class="token keyword">var</span></span> orders <span class="token operator">=</span> dbContext<span class="token punctuation">.</span>Orders <span class="token punctuation">.</span><span class="token function">GroupBy</span><span class="token punctuation">(</span>o <span class="token operator">=></span> o<span class="token punctuation">.</span>Customer<span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">Select</span><span class="token punctuation">(</span>g <span class="token operator">=></span> <span class="token keyword">new</span> <span class="token punctuation">{</span> Customer <span class="token operator">=</span> g<span class="token punctuation">.</span>Key<span class="token punctuation">,</span> OrderCount <span class="token operator">=</span> g<span class="token punctuation">.</span><span class="token function">Count</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
1 2 3 4 5 | <span class="token comment">//Target query</span> <span class="token class-name"><span class="token keyword">var</span></span> customers <span class="token operator">=</span> dbContext<span class="token punctuation">.</span>Customers <span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>Orders<span class="token punctuation">.</span><span class="token function">Any</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">Select</span><span class="token punctuation">(</span>c <span class="token operator">=></span> <span class="token keyword">new</span> <span class="token punctuation">{</span> Customer <span class="token operator">=</span> c<span class="token punctuation">,</span> OrderCount <span class="token operator">=</span> c<span class="token punctuation">.</span>Orders<span class="token punctuation">.</span><span class="token function">Count</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
=> Kết quả:
6. Sử dụng AsNoTracking trong Linq Entity framework
- Sử dụng AsNoTracking, Entity framework sẽ không track lại những thay đổi của entites. Điều này giúp cải thiện performance và giảm sử dụng bộ nhớ khi get dữ liệu bởi vì get dữ liệu không cần phải track lại những thay đổi.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <span class="token keyword">using</span> <span class="token namespace">System</span><span class="token punctuation">;</span> <span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Diagnostics</span><span class="token punctuation">;</span> <span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Linq</span><span class="token punctuation">;</span> <span class="token keyword">namespace</span> <span class="token namespace">AsNoTrackingBenchmark</span> <span class="token punctuation">{</span> <span class="token keyword">class</span> <span class="token class-name">Program</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">Main</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">using</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">var</span></span> db <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">MyDbContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// warmup</span> db<span class="token punctuation">.</span>Customers<span class="token punctuation">.</span><span class="token function">AsNoTracking</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName <span class="token operator">==</span> <span class="token string">"Smith"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> db<span class="token punctuation">.</span>Customers<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName <span class="token operator">==</span> <span class="token string">"Smith"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// AsNoTracking</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> db<span class="token punctuation">.</span>Customers<span class="token punctuation">.</span><span class="token function">AsNoTracking</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName <span class="token operator">==</span> <span class="token string">"Smith"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"AsNoTracking: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string"> ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// tracking</span> stopwatch<span class="token punctuation">.</span><span class="token function">Reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> db<span class="token punctuation">.</span>Customers<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>c <span class="token operator">=></span> c<span class="token punctuation">.</span>LastName <span class="token operator">==</span> <span class="token string">"Smith"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Tracking: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string"> ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
=> Kết quả:
1 2 3 | AsNoTracking: 194 ms Tracking: 298 ms |
7. Sử dụng Parallel LINQ
- Sử dụng Parallel LINQ có thể cải thiện performance của linq. Sau đây là 1 ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token class-name"><span class="token keyword">var</span></span> numbers <span class="token operator">=</span> Enumerable<span class="token punctuation">.</span><span class="token function">Range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1000000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> stopwatch <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">Stopwatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Measure time for LINQ query</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> result1 <span class="token operator">=</span> numbers<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>n <span class="token operator">=></span> n <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Time for LINQ query: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string"> ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Measure time for PLINQ query</span> stopwatch<span class="token punctuation">.</span><span class="token function">Reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name"><span class="token keyword">var</span></span> result2 <span class="token operator">=</span> numbers<span class="token punctuation">.</span><span class="token function">AsParallel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>n <span class="token operator">=></span> n <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stopwatch<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"Time for PLINQ query: </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">stopwatch<span class="token punctuation">.</span>ElapsedMilliseconds</span><span class="token punctuation">}</span></span><span class="token string"> ms"</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
=>Kết quả:
1 2 3 | Time for LINQ query: 11 ms Time for PLINQ query: 3 ms |
8. Linq performance trong .NET 7
- Ở phần này mình sẽ dùng benchmark so sánh performance giữa .net 6 và .net 7. Ở đây mình tham khảo page:
https://code-maze.com/linq-performance-dotnet7/ - Kết quả của 1 số methods:
- Min(), Max(), Average(), Count(), và Sum()
- First() và Last()
- Filtering Methods – Distinct() và Where()
- Min(), Max(), Average(), Count(), và Sum()
9. Tổng kết
- Qua bài viết này hy vọng mọi người hiểu thêm về LINQ và giúp ích được anh em với một số tips.
- Cảm ơn mọi người đã xem bài viết. Chúc anh em một ngày làm việc hiệu quả và đầy năng lượng.