对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表达式计算中,内存申请率较低。也就是说,内存写会对算法产生极大的影响。而在四种方法中一和二会对内存写有极大的需求。所以效率最低。

Linq查找最大值max最小值min效率比较的更多相关文章

  1. Java数组最大值和最小值

    package com.mybatis.demo.exercise; /** * @author yinsenxin */ public class ArrayMaxAndMin { public s ...

  2. Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作

    1.首先,须要一个节点对象的类.这些对象包括数据.数据代表存储的内容,并且还有指向节点的两个子节点的引用 class Node { public int iData; public double dD ...

  3. SQL中MAX()和MIN()函数的使用(比较字符串的大小)

    在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面就将为您分别介绍MAX()函数和MIN()函数的使用,供您参考,希望对您学习SQL数据库能有些帮助. 当需要了解一列中的最 ...

  4. 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]

    [本文链接] http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html [题目] 对于一个由N个整数组成的数组,需要比较多少次才能把 ...

  5. LINQ to SQL Count/Sum/Min/Max/Avg Join

    public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...

  6. 基于visual Studio2013解决算法导论之016查找最大值最小值

     题目 查找最大.最小值 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  7. java数组回顾---线性查找最大值最小值---二分查找

    import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...

  8. JS中Float类型加减乘除 修复 JQ 操作 radio、checkbox 、select LINQ to SQL:Where、Select/Distinct LINQ to SQL Count/Sum/Min/Max/Avg Join

    JS中Float类型加减乘除 修复   MXS&Vincene  ─╄OvЁ  &0000027─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄Ov ...

  9. Java基础系列 - 查找数组的最大值和最小值

    package com.test6; public class test5 { public static void main(String[] args) { int[] arr = {1, 2, ...

随机推荐

  1. 跟我学SpringCloud | 第四篇:熔断器Hystrix

    跟我学SpringCloud | 第四篇:熔断器Hystrix 1. 熔断器 服务雪崩 在正常的微服务架构体系下,一个业务很少有只需要调用一个服务就可以返回数据的情况,这种比较常见的是出现在demo中 ...

  2. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

  3. scikit-learn算法选择路径图

     原文链接:https://blog.csdn.net/guang_mang/article/details/73658496

  4. RQNOJ193 造路行动

    题目转移 详见最小生成树讲解 Kruskal #include<cstdio> #include<algorithm> using namespace std; ; int n ...

  5. 机器学习读书笔记(二)使用k-近邻算法改进约会网站的配对效果

    一.背景 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可以进行如下分类 不喜欢的人 魅力一般的人 极具魅 ...

  6. UESTC 1324:卿学姐与公主(分块)

    http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...

  7. 一、Java语言概述与开发环境、第一个java程序

    目录: 1.1 Java特点 1.2 Java程序运行机制 1.3 安装JDl和配置环境变量 1.4 第一个JAVA程序 1.5 第一个JAVA程序的含义 前言 Java语言历时近二十年,已发展成为人 ...

  8. Elasticsearch(一)开启外网访问

    1. 设置Elasticsearch对外访问的Host 修改Elasticsearch配置文件 elasticsearch.yml : network.host: 128.24.108.84  //在 ...

  9. 主机地址变更后,dubbo请求时依旧会寻址旧IP的问题

    机房迁移,导致测试服务器IP变更,比原于IP为192.168.1.105变更为10.1.9.120. 服务源码未做任何变更,启动服务时依旧是旧地址请求,此问题由dubbo本地注册中心的缓存所致,清理掉 ...

  10. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案

    jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...