Linq 性能测试

Linq 提供了一种在内存中操作数据的高效方式,写了一个测试 比较生成同等xml 的时间开销.

  构建基础类 提供原始xml 操作 和 基于 linq 的xml 操作

  

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml;
using System.Xml.Linq;

namespace Common
{
    public class LinqHelper
    {
        //Generates XML using XmlDocument
        public static void GenerateXmlUsingXmlDocument()
        {
            MemoryStream ms = new MemoryStream();
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "no"));
            XmlElement assembliesNode = xmlDoc.CreateElement("Assemblies");
            foreach (Type t in Assembly.GetAssembly(typeof(Object)).GetExportedTypes())
            {
                XmlElement assemblyNode = xmlDoc.CreateElement("Assembly");
                XmlAttribute fullTypeName = xmlDoc.CreateAttribute("FullTypeName");
                fullTypeName.Value = t.ToString();
                XmlAttribute isInterfaceName = xmlDoc.CreateAttribute("IsInterface");
                isInterfaceName.Value = t.IsInterface.ToString();
                assemblyNode.Attributes.Append(fullTypeName);
                assemblyNode.Attributes.Append(isInterfaceName);
                assembliesNode.AppendChild(assemblyNode);
            }
            xmlDoc.AppendChild(assembliesNode);
            xmlDoc.WriteContentTo(new XmlTextWriter(ms, System.Text.ASCIIEncoding.ASCII));
        }

        //Generates XML using XElement
        public static void GenerateXmlUsingXElement()
        {
            MemoryStream ms = new MemoryStream();
            XElement assembliesNode = new XElement("Assemblies",
                    from Type t in Assembly.GetAssembly(typeof(Object)).GetExportedTypes()
                    select new XElement("Assembly",
                        new XAttribute("FullTypeName", t.ToString()),
                        new XAttribute("IsInterface", t.IsInterface.ToString())));

            assembliesNode.Save(new XmlTextWriter(ms, System.Text.ASCIIEncoding.ASCII));
        }
    }
}

调用主题

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common;
namespace XmlDocument_VS_XDocment
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            for (int index = 0; index < 51; index++)
            {
                sw.Reset(); sw.Start();
                LinqHelper.GenerateXmlUsingXmlDocument();
                sw.Stop();
                Console.Write("Generation time using XmlDocument " +
                    "and XElement: " + sw.ElapsedMilliseconds);
                sw.Reset(); sw.Start();
                LinqHelper.GenerateXmlUsingXElement();
                sw.Stop();
                Console.WriteLine(" : " + sw.ElapsedMilliseconds);
                GC.Collect();
            }
            Console.ReadKey();
        }
    }
}

控制台内执行结果

对比执行时间差异,结论已经很明确了.

时间: 2024-10-28 16:19:46

Linq 性能测试的相关文章

性能测试类,让你写法代码养成经常测试的好习惯 -ASP.NET C#

介绍: 可以很方便的在代码里循环执行 需要测试的函数  自动统计出执行时间,支持多线程. 使用方法: PerformanceTest p = new PerformanceTest(); p.SetCount(10);//循环次数(默认:1) p.SetIsMultithread(true);//是否启动多线程测试 (默认:false) p.Execute( i => { //需要测试的代码 Response.Write(i+"<br>"); System.Threa

c#中装箱拆箱性能测试

c#中装箱拆箱性能测试 首先了解一下关于时间的换算: 1秒=1000毫秒: 1毫秒=1000微秒: 1微秒=1纳秒 而1毫秒=10000ticks:所以1ticks=100纳秒=0.1微秒 ticks这个属性值是指从0001年1月1日12:00:00开始到此时的以ticks为单位的时间,就是以ticks表示的时间的间隔数. 使用DateTime.Now.Ticks返回的是一个long型的数值. 然后上代码: using System; using System.Collections; usin

C#Stopwatch的使用,性能测试

一,先开启开始或继续测量某个时间间隔的运行时间,然后停止,最后重置时间,输出. using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class TestPerformance : System

C# 小规模查找集合性能测试

项目中包含浮点运算,大概每秒 20 - 100 万左右. 其计算结果每秒只包含1000个左右. 因此大量运算是重复性的.程序运行时,cpu 在 3% - 10% 浮动.打算将结果缓存.根据键值索值. 目前考虑数据类型有: SortedList , SortedDictionary , Dictionary , List .测试结果如下: 代码: using System; using System.Collections.Generic; using System.Linq; using Sys

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

.NET深入解析LINQ框架(一:LINQ优雅的前奏)

阅读目录: 1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 (对匿名方法的改进,加入了委托签名的类型推断并很好的与表达式树的结合) 2.4.扩展方法 (允许在不修改类型的内部代码的情况下为类型添加独立的行为) 2.5.匿名类型 (由对象初始化器推断得出的类型,该类型在编译后自动创建) 2.6.表达式目录树(用数据结构表示程序逻辑代码) 3.LINQ

.NET深入解析LINQ框架(二:LINQ优雅的前奏)

阅读目录: 1.LINQ框架的主要设计模型 1.1.链式设计模式 (以流水线般的链接方式设计系统逻辑) 1.2.链式查询方法(逐步加工查询表达式中的每一个工作点) 2.LINQ框架的核心设计原理 2.1.托管语言之上的语言(LINQ查询表达式) 2.2.托管语言构造的基础(LINQ依附通用接口与查询操作符对应的方法对接) 2.3.深入IEnumerable.IEnumerable<T>.Enumerable(LINQ to Object框架的入口) 2.4.深入IQueryable.IQuer

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

阅读目录: 1.开篇介绍 2.扩展Linq to Object (应用框架具有查询功能) 2.1.通过添加IEnumerable<T>对象的扩展方法 2.2.通过继承IEnumerable<T>接口 2.3.详细的对象结构图 3.实现IQueryable<T> .IQueryProvider接口 3.1.延迟加载IEnumertor<T>对象(提高系统性能) 3.2.扩展方法的扩展对象之奥秘(this IQueryable<TSource> so

.NET深入解析LINQ框架(三:LINQ优雅的前奏)

阅读目录: 1.动态LINQ查询(动态构建Expression<T>表达式树) 2.DLR动态语言运行时(基于CLR之上的动态语言运行时) 1].动态LINQ查询(动态构建Expression<T>表达式树) 什么是动态LINQ查询?LINQ的编写是静态的,因为C#是基于静态类型系统原理设计的,在编写时已经确定类型,也就是在编译时就已经知道将要执行什么样的查询,条件是什么.排序方式是什么等等.那么很大一部分应用场合中我们需要根据用户的选择来查询数据源,以往我们都是通过判断的方式来拼