Linq查找最大值max最小值min效率比較


對linq查找極值的幾種方法做一個效率上的比較

// 首先創建了一個10_000_000大小的PointF列表
var rdn = new Random();
var points = Enumerable
    .Range(0, 10_000_000)
    .Select(t =>
        new PointF((float)rdn.NextDouble() * 200, (float)rdn.NextDouble() * 200))
    .ToList();

// 方法一:最小/最大值只排一次序
var sth = new Stopwatch();
sth.Start();
var orderPX = points.OrderBy(t => t.X).ToList();
var orderPY = points.OrderBy(t => t.Y).ToList();
var minX = orderPX.First().X;
var maxX = orderPX.Last().X;
var minY = orderPY.First().Y;
var maxY = orderPY.Last().Y;
Console.WriteLine($"{nameof(minX)}:{minX}, {nameof(maxX)}:{maxX}, {nameof(minY)}:{minY}, {nameof(maxY)}:{maxY}");
Console.WriteLine($"OrderBy:{sth.Elapsed}");

// 方法二:先獲取值,在排序
sth.Restart();
var orderX = points.Select(t => t.X).OrderBy(t => t).ToList();
var orderY = points.Select(t => t.Y).OrderBy(t => t).ToList();
minX = orderX.First();
maxX = orderX.Last();
minY = orderY.First();
maxY = orderY.Last();
Console.WriteLine($"{nameof(minX)}:{minX}, {nameof(maxX)}:{maxX}, {nameof(minY)}:{minY}, {nameof(maxY)}:{maxY}");
Console.WriteLine($"Select,OrderBy:{sth.Elapsed}");

// 方法三:最小/最大值分別排序
sth.Restart();
minX = points.OrderBy(t=>t.X).First().X;
maxX = points.OrderByDescending(t=>t.X).First().X;
minY = points.OrderBy(t=>t.Y).First().Y;
maxY = points.OrderByDescending(t=>t.Y).First().Y;
Console.WriteLine($"{nameof(minX)}:{minX}, {nameof(maxX)}:{maxX}, {nameof(minY)}:{minY}, {nameof(maxY)}:{maxY}");
Console.WriteLine($"OrderBy,OrderByDescending:{sth.Elapsed}");


// 方法四:直接使用min/max函數
sth.Restart();
minX = points.Min(t => t.X);
maxX = points.Max(t => t.X);
minY = points.Min(t => t.Y);
maxY = points.Max(t => t.Y);
Console.WriteLine($"{nameof(minX)}:{minX}, {nameof(maxX)}:{maxX}, {nameof(minY)}:{minY}, {nameof(maxY)}:{maxY}");
Console.WriteLine($"min,max:{sth.Elapsed}");

結果如下:

minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
OrderBy:00:00:14.5413189

minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
Select,OrderBy:00:00:14.0296968

minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
Select,OrderBy:00:00:00.8116068

minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
min,max:00:00:00.5200925

總結:
最快的方法還是linq原生min/max函數 。效率是排序后查找方法一/二的30倍左右,內存需求也更小。方法一和二基本一致,也就是說無論值類型是什么,基本不對排序產生影像。而方法一和三差距如此之大,雖然看上去增加了排序的次數,但效率接近方法四。其原因是在一次完整的linq表達式計算中,內存申請率較低。也就是說,內存寫會對算法產生極大的影響。而在四種方法中一和二會對內存寫有極大的需求。所以效率最低。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM