本文没啥技术含量,就是测试一下 MSSqlHelper 在 使用反射、不使用反射 的性能对比。

之后,不要问为什么不用 ORM 这类的东西 —— 会有另外的文章 介绍 自己这些年 自己的ORM 升级历史。

背景:

我自己有一个 MSSqlHelper, 这个 辅助类  是最基本的一个 数据库操作类。

Query 查询集合时,可以指定  reader => 对象  的委托 —— 如果不指定,则 MSSqlHelper 会自动通过反射赋值。

        static void Main(string[] args)
{
Test0();
Test1(); Test0();
Test1(); Console.ReadKey();
} public static void Test0()
{
string connString = "Data Source=localhost;Initial Catalog=InkFxBlog;User Id=sa; Pwd=123.com;";
DateTime time0 = DateTime.Now;
List<TS_SDK> list = MSSqlHelper.Query<TS_SDK>(connString, "SELECT * FROM dbo.TS_SDK");
DateTime time1 = DateTime.Now;
Console.WriteLine("Test0 | " + list.Count + " | " + (time1 - time0).TotalSeconds + "秒");
} public static void Test1()
{
string connString = "Data Source=localhost;Initial Catalog=InkFxBlog;User Id=sa; Pwd=123.com;";
DateTime time0 = DateTime.Now;
List<TS_SDK> list = MSSqlHelper.Query<TS_SDK>(connString, "SELECT * FROM dbo.TS_SDK", null, reader =>
{
TS_SDK item = new TS_SDK();
item.FId = (Int64)reader["FId"];
item.FNumber = (string)reader["FNumber"];
item.FEnum = (string)reader["FEnum"];
item.FName = (string)reader["FName"];
item.FSDKName = (string)reader["FSDKName"];
item.FFullName = (string)reader["FFullName"];
item.FType = (string)reader["FType"];
item.FVisit = (string)reader["FVisit"];
item.FInheritFrom = (string)reader["FInheritFrom"];
item.FJoinBaseType = (string)reader["FJoinBaseType"];
item.FJoinChildType = (string)reader["FJoinChildType"];
item.FIsStatic = (Boolean)reader["FIsStatic"];
item.FIsOverride = (Boolean)reader["FIsOverride"];
item.FIsVirtual = (Boolean)reader["FIsVirtual"];
item.FIsAbstract = (Boolean)reader["FIsAbstract"];
item.FIsInherit = (Boolean)reader["FIsInherit"];
item.FIsNetFx = (Boolean)reader["FIsNetFx"];
item.FOutUrl = (string)reader["FOutUrl"];
item.FSummary = (string)reader["FSummary"];
item.FRtSummary = (string)reader["FRtSummary"];
item.FCSCode = (string)reader["FCSCode"];
item.FVBCode = (string)reader["FVBCode"];
item.FCPPCode = (string)reader["FCPPCode"];
item.FFSCode = (string)reader["FFSCode"];
item.FAssembly = (string)reader["FAssembly"];
item.FVersion = (string)reader["FVersion"];
item.FNameSpace = (string)reader["FNameSpace"];
item.FParentId = (Int64)reader["FParentId"];
item.FParentNumber = (string)reader["FParentNumber"];
item.FDemo = (string)reader["FDemo"];
item.FInfo = (string)reader["FInfo"];
return item;
});
DateTime time1 = DateTime.Now;
Console.WriteLine("Test1 | " + list.Count + " | " + (time1 - time0).TotalSeconds + "秒");
}

  

运行结果:

读取了全表 7W行记录。

—— 很明显:没有指定 reader 读取的委托、使用内置的反射代码 足足慢了 3秒。

—— 当然,MSSqlHelper 内置的委托 进行了稳定性控制,使用了 这类代码:

item.FId = Tools.ToLong(reader["FId"]);
item.FName = Tools.ToString("FName");

这类转换函数,性能肯定没有 下面的代码 性能快:

item.FId = (Int64)reader["FId"];
item.FName = (string)reader["FName"];

我为什么死活坚持 Tools 提供的 类型强转?

> 因为稳定

> 转换范围广 : 兼容下面这类 变态数据库数据

//这是 浏览器的 时间格式,以下代码 能得到 2017-03-20 02:46:06 000
DateTime timeA = Tools.ToDateTime("Mon Mar 20 2017 02:46:06 GMT+0800 (中国标准时间)"); //以下代码 能得到 2017-03-19 01:43:15 000
DateTime timeA = Tools.ToDateTime("2017年3月19日 01时43分15秒");

  

我们再使用 Tools 的类型强转函数 试一试,看一下 Tools 的类型转换会浪费多少性能

        public static void Test2()
{
string connString = "Data Source=localhost;Initial Catalog=InkFxBlog;User Id=sa; Pwd=123.com;";
DateTime time0 = DateTime.Now;
List<TS_SDK> list = MSSqlHelper.Query<TS_SDK>(connString, "SELECT * FROM dbo.TS_SDK", null, reader =>
{
TS_SDK item = new TS_SDK(); //这次的 reader 委托,
//类型转换 使用的 Tools.ToLong() Tools.ToLong() 这类函数
//为什么不直接用 (string)reader["FName"] 这类直接转换 ? —— 为了稳定性、我宁愿牺牲性能 item.FId = Tools.ToLong(reader["FId"]);
item.FNumber = Tools.ToString(reader["FNumber"]);
item.FEnum = Tools.ToString(reader["FEnum"]);
item.FName = Tools.ToString(reader["FName"]);
item.FSDKName = Tools.ToString(reader["FSDKName"]);
item.FFullName = Tools.ToString(reader["FFullName"]);
item.FType = Tools.ToString(reader["FType"]);
item.FVisit = Tools.ToString(reader["FVisit"]);
item.FInheritFrom = Tools.ToString(reader["FInheritFrom"]);
item.FJoinBaseType = Tools.ToString(reader["FJoinBaseType"]);
item.FJoinChildType = Tools.ToString(reader["FJoinChildType"]);
item.FIsStatic = Tools.ToBoolean(reader["FIsStatic"]);
item.FIsOverride = Tools.ToBoolean(reader["FIsOverride"]);
item.FIsVirtual = Tools.ToBoolean(reader["FIsVirtual"]);
item.FIsAbstract = Tools.ToBoolean(reader["FIsAbstract"]);
item.FIsInherit = Tools.ToBoolean(reader["FIsInherit"]);
item.FIsNetFx = Tools.ToBoolean(reader["FIsNetFx"]);
item.FOutUrl = Tools.ToString(reader["FOutUrl"]);
item.FSummary = Tools.ToString(reader["FSummary"]);
item.FRtSummary = Tools.ToString(reader["FRtSummary"]);
item.FCSCode = Tools.ToString(reader["FCSCode"]);
item.FVBCode = Tools.ToString(reader["FVBCode"]);
item.FCPPCode = Tools.ToString(reader["FCPPCode"]);
item.FFSCode = Tools.ToString(reader["FFSCode"]);
item.FAssembly = Tools.ToString(reader["FAssembly"]);
item.FVersion = Tools.ToString(reader["FVersion"]);
item.FNameSpace = Tools.ToString(reader["FNameSpace"]);
item.FParentId = Tools.ToLong(reader["FParentId"]);
item.FParentNumber = Tools.ToString(reader["FParentNumber"]);
item.FDemo = Tools.ToString(reader["FDemo"]);
item.FInfo = Tools.ToString(reader["FInfo"]);
return item;
});
DateTime time1 = DateTime.Now;
Console.WriteLine("Test2 | " + list.Count + " | " + (time1 - time0).TotalSeconds + "秒");
}

  

再测试一下:

—— 近期想把自己的底层辅助类 再优化一下,所以把代码翻出来,折腾一下 ~

----------------------------------------------------------------------------------------------------------------------------------------

刚刚修改了一下 反射的代码,启用了 Emit 高速反射

性能果然得到了 明显提升,性能仅损失 15 ~20%  —— 我已经知足了。

Ps. 目前的 Emit反射 使用的通用代码(内外一个辅助类) —— 如果针对性的写 Emit 代码,性能还能再次提升,但我懒得写。

----------------------------------------------------------------------------------------------------------------------------------------

增加了一个 最原生写法 —— 也就是 性能极限

        public static void TestSouce()
{
string connString = "Data Source=localhost;Initial Catalog=InkFxBlog;User Id=sa; Pwd=123.com;";
DateTime time0 = DateTime.Now; List<TS_SDK> list =new List<TS_SDK>();
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM dbo.TS_SDK";
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
TS_SDK item = new TS_SDK();
item.FId = (Int64)reader["FId"];
item.FNumber = (string)reader["FNumber"];
item.FEnum = (string)reader["FEnum"];
item.FName = (string)reader["FName"];
item.FSDKName = (string)reader["FSDKName"];
item.FFullName = (string)reader["FFullName"];
item.FType = (string)reader["FType"];
item.FVisit = (string)reader["FVisit"];
item.FInheritFrom = (string)reader["FInheritFrom"];
item.FJoinBaseType = (string)reader["FJoinBaseType"];
item.FJoinChildType = (string)reader["FJoinChildType"];
item.FIsStatic = (Boolean)reader["FIsStatic"];
item.FIsOverride = (Boolean)reader["FIsOverride"];
item.FIsVirtual = (Boolean)reader["FIsVirtual"];
item.FIsAbstract = (Boolean)reader["FIsAbstract"];
item.FIsInherit = (Boolean)reader["FIsInherit"];
item.FIsNetFx = (Boolean)reader["FIsNetFx"];
item.FOutUrl = (string)reader["FOutUrl"];
item.FSummary = (string)reader["FSummary"];
item.FRtSummary = (string)reader["FRtSummary"];
item.FCSCode = (string)reader["FCSCode"];
item.FVBCode = (string)reader["FVBCode"];
item.FCPPCode = (string)reader["FCPPCode"];
item.FFSCode = (string)reader["FFSCode"];
item.FAssembly = (string)reader["FAssembly"];
item.FVersion = (string)reader["FVersion"];
item.FNameSpace = (string)reader["FNameSpace"];
item.FParentId = (Int64)reader["FParentId"];
item.FParentNumber = (string)reader["FParentNumber"];
item.FDemo = (string)reader["FDemo"];
item.FInfo = (string)reader["FInfo"];
list.Add(item);
}
}
}
} DateTime time1 = DateTime.Now;
Console.WriteLine("TestSouce | " + list.Count + " | " + (time1 - time0).TotalSeconds + "秒");
}

  

----------------------------------------------------------------------------------------------------------------------------------------

彻底完成,性能已经到达极限

PS. 笔误: Emit高速反射

『性能』测试一下 MSSqlHelper 的性能的更多相关文章

  1. 『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )

    结论: 总数 50000 (5万): List 检索 5W次 耗时 23秒, HashSet 检索 5W次 耗时 0.01秒. 总数 5000   (5千): List 检索 5K次 耗时 0.16秒 ...

  2. 『MXNet』第六弹_Gluon性能提升

    一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...

  3. 『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程

    https://www.cnblogs.com/hellcat/p/9084894.html 目录 一.符号式编程 1.命令式编程和符号式编程 2.MXNet的符号式编程 二.惰性计算 用同步函数实际 ...

  4. Struts2、SpringMVC、Servlet(Jsp)性能对比 测试

    Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要 ...

  5. 『MXNet』专题汇总

    MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...

  6. 『Nltk』常用方法

    引言 在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍. 文本处理 ...

  7. 【转】Web性能压力测试工具之ApacheBench(ab)详解

    PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...

  8. [AapacheBench工具]web性能压力测试工具的应用与实践

    背景:网站性能压力测试是性能调优过程中必不可少的一环.服务器负载太大而影响程序效率是很常见的事情,一个网站到底能够承受多大的用户访问量经常是我们最关心的问题.因此,只有让服务器处在高压情况下才能真正体 ...

  9. Web性能压力测试工具之ApacheBench(ab)详解

    PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...

随机推荐

  1. java 通过HttpURLConnection与servlet通信

    研究了一天才搞清楚,其实挺简单的,在这里记录下,以便以后参考. 一.创建一个servlet项目 主要包括(WEB-INF)里面有classes文件夹.lib文件夹.web.xml文件. 将写好的ser ...

  2. Excel常用的格式处理

    你有没有碰到在Excel中设置了行高自适应后,部分行的行高太小,整体界面不美观的问题呢? 你有没有碰到Excel中的各个sheet页中的各列内容中都有不同个数的回车换行符,内容看起来参差不齐,不美观呢 ...

  3. 50行ruby代码开发一个区块链

    区块链是什么?作为一个Ruby开发者,理解区块链的最好办法,就是亲自动手实现一个.只需要50行Ruby代码你就能彻底理解区块链的核心原理! 区块链 = 区块组成的链表? blockchain.ruby ...

  4. mac的terminal快捷键

    mac终端terminal快捷键: Command + K 清屏 Command + T 新建标签 Command +W  关闭当前标签页 Command + S  保存终端输出 Command + ...

  5. 网络Socket编程及实例

    1 TCP和UDP介绍 在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次. 1.1  网络体系结构 协议:控制网络中信息的发送和接收.定义了通信实体之间交换报文的格式和次序,以及在报文传 ...

  6. JFrame图形界面 ----绝对布局和按钮

    开始 绝对布局应该是最简单的一种布局方式了,只需要确定好大小和位置就可以固定不变 代码 ` package window; import java.awt.Color; import java.awt ...

  7. 如何离线安装python的whl库

    对于使用公司内网环境办公的人来说,可能无法使用pip install 命令安装python的whl库.对于这种情况,我们可以用以下的方法安装一个whl库. 1 下载whl文件,下载时注意,whl文件的 ...

  8. AWS的区域和可用区概念解释

    AWS的每个区域一般由多个可用区(AZ)组成,而一个可用区一般是由多个数据中心组成.AWS引入可用区设计主要是为了提升用户应用程序的高可用性.因为可用区与可用区之间在设计上是相互独立的,也就是说它们会 ...

  9. 超实用的JavaScript代码段 Item2 --伸缩菜单栏

    伸缩菜单栏 点击标题时判断该标题下的菜单是否显示,如果是显示的则将其隐藏,如果是隐藏的则将其显示出来. <!doctype html> <html lang="en&quo ...

  10. Latex appendix 生成附录A和B

    第一种: \documentclass[a4paper,12pt]{cctart} \begin{document}     main body %正文内容   \appendix   \renewc ...