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表达式计算中,内存申请率较低。也就是说,内存写会对算法产生极大的影响。而在四种方法中一和二会对内存写有极大的需求。所以效率最低。
Linq查找最大值max最小值min效率比较的更多相关文章
- Java数组最大值和最小值
package com.mybatis.demo.exercise; /** * @author yinsenxin */ public class ArrayMaxAndMin { public s ...
- Java对二叉搜索树进行插入、查找、遍历、最大值和最小值的操作
1.首先,须要一个节点对象的类.这些对象包括数据.数据代表存储的内容,并且还有指向节点的两个子节点的引用 class Node { public int iData; public double dD ...
- SQL中MAX()和MIN()函数的使用(比较字符串的大小)
在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面就将为您分别介绍MAX()函数和MIN()函数的使用,供您参考,希望对您学习SQL数据库能有些帮助. 当需要了解一列中的最 ...
- 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]
[本文链接] http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html [题目] 对于一个由N个整数组成的数组,需要比较多少次才能把 ...
- LINQ to SQL Count/Sum/Min/Max/Avg Join
public class Linq { MXSICEDataContext Db = new MXSICEDataContext(); // LINQ to SQL // Count/Sum/Min/ ...
- 基于visual Studio2013解决算法导论之016查找最大值最小值
题目 查找最大.最小值 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...
- java数组回顾---线性查找最大值最小值---二分查找
import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...
- 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 ...
- Java基础系列 - 查找数组的最大值和最小值
package com.test6; public class test5 { public static void main(String[] args) { int[] arr = {1, 2, ...
随机推荐
- 跟我学SpringCloud | 第四篇:熔断器Hystrix
跟我学SpringCloud | 第四篇:熔断器Hystrix 1. 熔断器 服务雪崩 在正常的微服务架构体系下,一个业务很少有只需要调用一个服务就可以返回数据的情况,这种比较常见的是出现在demo中 ...
- Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)
简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...
- scikit-learn算法选择路径图
 原文链接:https://blog.csdn.net/guang_mang/article/details/73658496
- RQNOJ193 造路行动
题目转移 详见最小生成树讲解 Kruskal #include<cstdio> #include<algorithm> using namespace std; ; int n ...
- 机器学习读书笔记(二)使用k-近邻算法改进约会网站的配对效果
一.背景 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可以进行如下分类 不喜欢的人 魅力一般的人 极具魅 ...
- UESTC 1324:卿学姐与公主(分块)
http://acm.uestc.edu.cn/#/problem/show/1324 题意:…… 思路:卿学姐的学习分块例题. 分块是在线处理区间问题的类暴力算法,复杂度O(n*sqrt(n)),把 ...
- 一、Java语言概述与开发环境、第一个java程序
目录: 1.1 Java特点 1.2 Java程序运行机制 1.3 安装JDl和配置环境变量 1.4 第一个JAVA程序 1.5 第一个JAVA程序的含义 前言 Java语言历时近二十年,已发展成为人 ...
- Elasticsearch(一)开启外网访问
1. 设置Elasticsearch对外访问的Host 修改Elasticsearch配置文件 elasticsearch.yml : network.host: 128.24.108.84 //在 ...
- 主机地址变更后,dubbo请求时依旧会寻址旧IP的问题
机房迁移,导致测试服务器IP变更,比原于IP为192.168.1.105变更为10.1.9.120. 服务源码未做任何变更,启动服务时依旧是旧地址请求,此问题由dubbo本地注册中心的缓存所致,清理掉 ...
- Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案
jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...