LINQ性能分析系列之传说中的LINQ

话说自从 Beta1 发布以来,关于 .Net Framework 3.5 的讨论真是沸沸扬扬。我大概也算是比较早吃螃蟹的一位,Beta1 发布伊始就将它用于正式的开发中。虽然其间遇到过许许多多的 BUG,对于 .Net Framework 3.5 的核心特性 - LINQ,我个人感觉还是相当满意的。然而仅仅是 LINQ 比较酷的语法,绝不足以决定项目所用的技术。事实上,如果不是我这种个人作坊式的开发,评估新技术是否采用很重要的一点,就是它的性能是否令人满意。如果您还不了解 LINQ,可以通过简单的 VB9 示例作出感性的认知。

LINQ 基础示例

Dim Collection As String() = {"Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shijiazhuang", "Tianjin", "Taiyuan}
Console.WriteLine((From City In Collection Where City(0) = "T").First)

在此要强调一点,绝不要把 LINQ 与 Linq to SQL(DLINQ) 混为一谈,DLINQ 仅仅是 LINQ 的一个应用,绝非 LINQ 的全部。与 LINQ 一同来到的是大量的编译器特性,不论是 C#3 或是 VB9,都有着许多令人耳目一新的新语法特性。然而,由于 .Net Framework 3.x 都是 .Net Framework 2 的超集,所以所有的语法特性都不过是编译时的翻译。如果您试图反编译 LINQ 表达式,Lambda 或匿名函数,您将见到大批的函数嵌套,不知名的函数与其他令人头昏脑涨的程序结构。这一切都是编译器代为完成的。您无需担心 C# 中的 Var,或是 VB 中的无需 As 的变量定义带来的装/拆箱问题,它们将在 IL 中被推断为真实的数据类型。

探讨 LINQ 的性能问题时,我们将不仅局限于简单的时间比较,还将对 LINQ 的实现代码进行简单的分析,并就 Linq to SQL 生成的 T-SQL 语句讨论优化数据库性能的方法。工欲善其事,必先利其器,此系列中测试的平台基于 SQL Server 2005 SP2,反编译工具采用 Lutz Roeder's Reflector。

言归正传。由于应用了扩展方法,LINQ 得以查询任何现有 IEnumerable(Of T) 的内容。但是,性能问题却被隐藏在通用性与易用性之下。让我们做一个简短的测试,测试是使用 LINQ 获取一个随机数字数组的开头,结尾与总计,并与传统方式按数组索引获取作出对比。测试代码如下:

Visual Basic 9 - LINQ 性能测试: 获取随机数组数据

Sub Main()        Dim Start As Integer        For Count As Integer = 0 To 2            Dim Random As New Random            Dim TempArray As New List(Of Integer)            '生成测试数组            For I As Integer = 0 To 50000                TempArray.Add(Random.Next(10000, 99999))            Next            '进行测试查询            Dim Source As Integer() = TempArray.ToArray            '计算时间            '获取最后一条            Start = Timer            Dim Last As Integer, First As Integer, Length As Integer            For I As Integer = 0 To 500000                Last = Source.Last                First = Source.First                Length = Source.Count            Next            System.Console.WriteLine("Linq 查询数组首末与统计耗时: " & Math.Abs(Timer -Start) * 1000 & " 毫秒")            '方法2: 计算时间            Start = Timer            '获取最后一条            Length = Source.Length - 1            For I As Integer = 0 To 500000                Last = Source(Length - 1)                First = Source(0)                Length = Source.Length            Next            System.Console.WriteLine("传统查询数组首末与统计耗时: " & Math.Abs(Timer - Start) * 1000 & " 毫秒")        Next    End Sub

程序运行于 Release 模式下,连续测试3次。测试结果如下:

Linq 查询数组首末与统计耗时: 2109.375 毫秒

传统查询数组首末与统计耗时: 296.875 毫秒

Linq 查询数组首末与统计耗时: 2406.25 毫秒

传统查询数组首末与统计耗时: 406.25 毫秒

Linq 查询数组首末与统计耗时: 2156.25 毫秒

传统查询数组首末与统计耗时: 218.75 毫秒

看到这里,通用的 LINQ 与传统方法的差距就已明了。虽然仅仅是管中窥豹式的简单测试,但各位若无必要,还是尽量使用原生于数组的功能。当然,各位看官欲知为何差距如此之大,且听下回分解。水平有限,若有错谬,敬请谅解并指出。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索耗时计算
, 数组
, 测试
, 查询
, linq
, integer
, 毫秒
, linq的相关技术生成
linq问题
linq 性能、linq 性能优化、linq to sql 性能、ado.net linq 性能、c linq 性能,以便于您获取更多的相关知识。

时间: 2024-10-03 20:44:53

LINQ性能分析系列之传说中的LINQ的相关文章

性能分析系列-小命令保证大性能 | 程超

编者按:程超在圈里有读三遍经典文章的习惯,江湖人称三遍哥,程超作为易宝支付的架构师,有10多年的JAVA开发经历,专注于金融支付与大数据领域,他将工作之中遇到的问题和经验都分享在简书(小程故事多)里面,小编略微采集小部分放到中生代公众号里,以飨读者! 最近在工作中经常和性能压测工作打交道,积累了一些性能分析经验,我觉得这些经验对每一个开发者都有帮助的,能开发出性能高的代码也是我们的最终目标. 由易到难,我们逐步介绍不同命令的用法和好处,这些命令是如何帮助我们开发人员进行性能分析的. 一.开发者的

性能分析系列1:小命令保证大性能

作者介绍  程超,易宝支付架构师,10年JAVA工作经验,擅长分布式和大数据技术领域,目前主要从事金融支付类方性能分析向.   最近在工作中经常和性能压测工作打交道,积累了一些性能分析经验,我觉得这些经验对每一个开发者都有帮助的,能开发出性能高的代码也是我们的最终目标. 由易到难,我们逐步介绍不同命令的用法和好处,这些命令是如何帮助我们开发人员进行性能分析的. 一开发者的自测利器-Hprof命令 1.示例演示 例子程序: 注:这是一段测试代码通过sleep方法进行延时,在程序运行过程中很慢,我想

一起谈.NET技术,数组排序方法的性能比较(3):LINQ排序实现分析

上次我们分析了Array.Sort方法的实现方式,并了解到类库会为一些特例而使用高性能的排序方式--int数组便是这样一例,因此从测试结果上来看其性能特别高.不过从数据上看,即便是在普通的情况下,Array.Sort的性能也比LINQ排序要高.不过也有朋友从测试中得出的结论正好相反,这又是为什么呢?那么现在,我们再来分析一下LINQ排序的实现方式吧,希望这样可以了解到两者性能差别的秘密. 只可惜,LINQ排序的代码在System.Core.dll程序集中,微软没有发布这部分源代码,我们只得使用.

Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例  Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理.解决办法)  Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列06之 Vector详细介绍(源码解析)和使用示例 Java 集合系列07之 Stack

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name "LINQ via C#" is copied from " CLR via C# ", one of my favorite books. Currently part 1 – 8 are finished, and the entire series should be 10 parts. The contents are: I

ORA FAQ 性能调整系列之——当索引第一列由序列产生,一个逆序索引有什么用?

索引|性能 ORA FAQ 性能调整系列之--The Oracle (tm) Users' Co-Operative FAQWhy would a reverse index be useful when the leading column of the index is generated from a sequence ?当索引第一列由序列产生,一个逆序索引有什么用?--------------------------------------------------------------

百度工程师讲PHP函数的实现原理及性能分析(三)

  这篇文章主要介绍了百度工程师讲PHP函数的实现原理及性能分析(三),本文讲解了常用php函数实现及介绍,并作了总结及建议,需要的朋友可以参考下 常用php函数实现及介绍 count count是我们经常用到的一个函数,其功能是返回一个数组的长度. count这个函数,其复杂度是多少呢? 一种常见的说法是count函数会遍历整个数组然后求出元素个数,因此复杂度是O(n).那实际情况是不是这样呢?我们回到count的实现来看一下,通过源码可以发现,对于数组的count操作,函数最终的路径是zif

PHP 性能分析与实验:性能的微观分析

在上一篇文章中,我们从 PHP 是解释性语言.动态语言和底层实现等三个方面,探讨了 PHP 性能的问题.本文就深入到 PHP 的微观层面,我们来了解 PHP 在使用和编写代码过程中,性能方面,可能需要注意和提升的地方. 在开始分析之前,我们得掌握一些与性能分析相关的函数.这些函数让我们对程序性能有更好的分析和评测. 一.性能分析相关的函数与命令 1.1.时间度量函数 平时我们常用 time() 函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的.于是要用 microtime

Jquery1.9.1源码分析系列(十五)动画处理之外篇_jquery

a.动画兼容Tween.propHooks Tween.propHooks提供特殊情况下设置.获取css特征值的方法,结构如下 Tween.propHooks = { _default: { get: function(){...}, set: function(){...} }, scrollTop: { set: function(){...} } scrollLeft: { set: function(){...} } } Tween.propHooks.scrollTop 和Tween.