『性能』测试一下 MSSqlHelper 的性能
本文没啥技术含量,就是测试一下 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 的性能的更多相关文章
- 『性能』List 和 HashSet 查找性能比较 (任何数据量的检索 从此只用 HashSet )
结论: 总数 50000 (5万): List 检索 5W次 耗时 23秒, HashSet 检索 5W次 耗时 0.01秒. 总数 5000 (5千): List 检索 5K次 耗时 0.16秒 ...
- 『MXNet』第六弹_Gluon性能提升
一.符号式编程 1.命令式编程和符号式编程 命令式: def add(a, b): return a + b def fancy_func(a, b, c, d): e = add(a, b) f = ...
- 『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程
https://www.cnblogs.com/hellcat/p/9084894.html 目录 一.符号式编程 1.命令式编程和符号式编程 2.MXNet的符号式编程 二.惰性计算 用同步函数实际 ...
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要 ...
- 『MXNet』专题汇总
MXNet文档 MXNet官方教程 持久化模型 框架介绍 『MXNet』第一弹_基础架构及API 『MXNet』第二弹_Gluon构建模型 『MXNet』第三弹_Gluon模型参数 『MXNet』第四 ...
- 『Nltk』常用方法
引言 在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍. 文本处理 ...
- 【转】Web性能压力测试工具之ApacheBench(ab)详解
PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...
- [AapacheBench工具]web性能压力测试工具的应用与实践
背景:网站性能压力测试是性能调优过程中必不可少的一环.服务器负载太大而影响程序效率是很常见的事情,一个网站到底能够承受多大的用户访问量经常是我们最关心的问题.因此,只有让服务器处在高压情况下才能真正体 ...
- Web性能压力测试工具之ApacheBench(ab)详解
PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...
随机推荐
- 分享一下在aspx页面弹框的设置代码
public static class MessageBox { /// <summary> /// 显示消息提示对话框 /// </summary> /// <para ...
- 腾讯云Unubtu 16.04 (gunicorn+supervisor+ngnix+mongodb)部署Flask应用
1.申请腾讯云服务 我申请了免费使用的云服务器 ,选择安装的Linux版本是ubuntu16.04.1 LTSx86_64.我个人PC安装使用的也是这个版本,比较熟悉些. 详细参考帮助文档. 2.登录 ...
- 登录测试用例sql语句注入
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- iOS webservice接口soap协议调用遇到的问题
这是第一次调webservice的接口,并且后台没太做过移动端的接口,所以遇到了很多让人崩溃的困难.吃一堑长一智,所以这种时候懒得写博客的我就要趁着这股热乎劲把这次的过程记录下来啦~ 首先要做的就是, ...
- Mac下设置JAVA_HOME和MAVEN_HOME
1.找到java安装路径 /usr/libexec/java_home 2.设置JAVA_HOME $ vim ~/.bash_profile ~/.bash_profile:每个用户都可使用该文件输 ...
- dubbo实现原理简单介绍
一.什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看, ...
- form 表单提交返回值问题
form不比ajax,即使后台返回值后,在页面也不知道怎么去取值判断提交状态.所以前几天结合网上资料整了一个小案例,需要用到ajaxSubmit,即通过ajax来提交表单,好处在于可以在任何情况下进行 ...
- Clloection接口 与List接口
collection接口: collection是单列集合接口的根接口,该接口中又包含了多个集合接口,collection接口提供了很多操作集合的方法,比如添加元素的方法,删除元素的方法,修改元素的方 ...
- 最简单易懂的SpringCloudSleuth教程
事务mapjvm 大佬对下面的说法是否同意呢 能否比较下zipkin,pinpoint,以及skywalking.该如何选型 回答: 他们都提供了分布式服务跟踪的能力,pinpoint以及skywal ...
- jmeter 监听器聚合报告说明:
Label:表示定义HTTP请求名称 Samples:表示这次测试中一共发出了多少个请求. Average:平均响应时长---默认情况下是单个Request的平均响应时长,当使用了Transactio ...