对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.5413189minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
Select,OrderBy:00:00:14.0296968minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
Select,OrderBy:00:00:00.8116068minX:6.938353E-05, maxX:200, minY:1.117587E-05, maxY:200
min,max:00:00:00.5200925

总结:
最快的方法还是linq原生min/max函数 。效率是排序后查找方法一/二的30倍左右,内存需求也更小。方法一和二基本一致,也就是说无论值类型是什么,基本不对排序产生影像。而方法一和三差距如此之大,虽然看上去增加了排序的次数,但效率接近方法四。其原因是在一次完整的linq表达式计算中,内存申请率较低。也就是说,内存写会对算法产生极大的影响。而在四种方法中一和二会对内存写有极大的需求。所以效率最低。

转载于:https://www.cnblogs.com/hsxian/p/11207249.html

Linq查找最大值max最小值min效率比较相关推荐

  1. 【例4-3】利用数组,给定N个正整数数据(N<=100),查找最大值和最小值并输出。【输入输出样例】Input length (N<=100):(此处括号、冒号为英文符号,后面无空格;leng

    [例4-3]利用数组,给定N个正整数数据(N<=100),查找最大值和最小值并输出. [输入输出样例] Input length (N<=100):(此处括号.冒号为英文符号,后面无空格: ...

  2. python中max()、min()获得最大值与最小值_(Python基础教程之十)Python max()和min()–在列表或数组中查找最大值和最小值...

    使用**max()和min()**方法在可比较元素的集合(例如列表,集合或数组)中查找最大(或最小)项的Python示例. 1. Python max() function max() 该功能用于– ...

  3. 【C语言】用二分法递归实现乱序链表查找最大值和最小值

    给定一个含n个整数顺序存储的线性表,按分治法思路,采用二分策略,设计一个求出其最大值和最小值算法,编写相应测试程序.要求使用分治法设计出其中求最大值.最小值组合的递归算法. 样例">输 ...

  4. c语言找出最大的偶数,查找最大值和最小值为偶数和奇数

    使用dplyr,制作一组赔率/平均值,然后获得每组最小最大值. library(dplyr) df1 %>% mutate(grp = if_else(numbers %% 2 == 0, &q ...

  5. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  6. java list find方法_Java 8 Stream - Find Max and Min from List - 入门小站-rumenz.com

    学习使用查找最小和最大日期,数字,字符,字符串或对象. Find Min or Max Date 要从日期流中获取最大或最小日期 ,可以使用Comparator.comparing( LocalDat ...

  7. Java基础---数组练习(最大值、最小值的索引)

    Java基础–数组练习 1.将一维数组的遍历,封装成方法public static void arrayBianli(int[] arr) {for(int i = 0;i<arr.length ...

  8. 使用Math.max和Math.min求数组的最大值和最小值

    正常情况下,如果我们求数组的值,用到的就是for循环,如果在代码中经常求最大值和最小值的话,会显得代码很乱.所以,就考虑一中最简单的方法求最大值. 使用Math里面自带的max和min方法 funct ...

  9. R语言max函数min函数计算各种数据对象最大值最小值实战

    R语言max函数min函数计算各种数据对象最大值最小值实战 目录 R语言max函数min函数计算各种数据对象最大值最小值实战 #基本语法

  10. 汇编语言 把最大值放入max 把最小值放入min_Excel的MAX和MIN,如何用白话弄懂?...

    今天我们要聊的Excel的最大值和最小值就比较好找!我们继续大白话聊Excel系列,来看看这几个函数究竟怎么用. 在基础统计时,常常需要看一下最大值和最小值,那么用Excel能不能搞定呢?生活中很多电 ...

最新文章

  1. Hive之 Hql语法解析
  2. 【剑指offer-Java版】01为了准备面试也为了提升编程技巧开始刷宝典了
  3. Java单例模式代码实现方式
  4. python.freelycode.com-Python中的并行处理 -- 实例编程指南
  5. js快速判断IE浏览器(兼容IE10与IE11)
  6. jQuery(function(){...})与(function($){...})(jQuery)的“兄弟”情结
  7. 深入理解Javascript之执行上下文(Execution Context)
  8. 4qam、16qam、64qam、256qam理论仿真曲线
  9. 安装Exchange2007邮件系统
  10. Java核心技术卷1:基础知识(原书第10版)
  11. 大华相机SDK调用——主动采图、外触发、参数
  12. 国家行政区划数据结构化入库
  13. 迁移学习VGG16实现猫狗大战
  14. win10如何打开摄像头_win10录屏软件哪个好?可录摄像头不限时长的视频录制方法...
  15. Intent的基本属性及用法
  16. IOS error:Images.xcassets: error: ERROR: Each TDDistiller instance can be distilled only one time!
  17. 弹幕插件easyDanmaku.js使用详解
  18. Android实战(四)——正能量日报
  19. 违背基本假设的几种情况——异方差性(R语言)
  20. 链家网页爬虫_分享最近做的一个链家二手房爬虫和对爬到的数据进行可视化分析的案例...

热门文章

  1. 《指弹:November.28th》
  2. div+css画六边形
  3. Gson Builder — Gson Lenient 属性
  4. 百度谷歌雅虎三大搜索引擎本土功能大PK
  5. Linux修改只读文件(Read-Only)的方法
  6. SpringBoot应用接入Prometheus+Grafana
  7. IntelliJ IDEA 2019 配置PHP开发环境
  8. 51单片机电路原理图_(51单片机)课设项目2-超声波测距(SRF04、LCD1602、蜂鸣器报警电路)...
  9. git学习(一)初始化
  10. oracle remote diagnostic agent,Oracle数据库收集、分析工具RDA(RemoteDiagnostic Agent)下载