知识大全 经测试ADO.NET 2.0竟然比1.0要慢

Posted 时间

篇首语:知识就像内裤,看不见但很重要。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 经测试ADO.NET 2.0竟然比1.0要慢相关的知识,希望对你有一定的参考价值。

经测试ADO.NET 2.0竟然比1.0要慢  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  镜子里面的像 为什么左右是反的而上下不是?

  我问过很多朋友这个问题 很少有人能够在3分钟内给出准确答案 这里列举出一些比较奇特的想法

   因为人的眼睛是左右对称的 (也是某 面试宝典 中的答案)

   如果把镜子横过来 左右不反了 上下却反了

   因为我们在北半球

  从技术层面上说 这里涉及的知识点只有镜面反射 远比Windows内存管理简单 但是要回答清楚 却不是信手拈来那么简单 这个例子只是想说明 除了知识以外 解决问题需要清晰的思路

   绝望的性能问题 ADO NET 竟然比 要慢

   问题描述

  根据下面一篇文章的介绍 客户决定升级到 NET Framework 来借助ADO NET 提高性能

  DataSet and DataTable in ADO NET

  

  但是根据用户的测试 使用ADO NET 后 性能反而下降

  拿到用户的代码一看 非常简单

  OracleConnection conn = new OracleConnection();

  conn ConnectionString = ;

  conn Open();

  OracleCommand cmd = new OracleCommand();

  cmd Connection = conn;

  OracleDataAdapter dap = new OracleDataAdapter( select * from mytesttable conn);

  DataTable dt = new DataTable();

  DateTime start = System DateTime Now;

  dap Fill(dt);

  TimeSpan span = DateTime Now start;

  conn Close();

  Console WriteLine(span ToString());

  Console WriteLine( The Columns Count is + dt Columns Count ToString());

  Console WriteLine( The Rows Count is +dt Rows Count ToString());

  

  测试用的数据库表也很简单 万行数据 个字段 通过检查span ToString的结果 发现同样的代码 ADO NET 比 多用了近一倍的时间 dap Fill方法的执行时间从原来的 秒增加到 秒

   悲观和绝望

  应该如何着手解决这个问题?

  我测试完成 看到这个结果后 我的感觉 悲观 看看我们能够做什么

   后台数据库表格的定义非常简单 个字段都是int 都是在没有index primary key foreign key等约束条件下测试的 也就是说 这个问题跟数据表的Schema定义无关 完全是客户端的问题

   代码已经非常简单 Console工程里Main函数就做这么一件事情 客户端没有任何可以修改和变动的地方

   NET Framework 和 NET Framework 共存在同一个客户端 测试也是在同一个客户端进行的 所以软硬件环境 比如Oracle Client都相同 唯一的区别就是 NET Framework的版本 这也就是客户最关心的地方

  这个工具可以显示出每一个方法(包括子方法)调用所花费的时间 以及占整体运行时间的比例 为了让问题更加明显 这里把数据库的行数增加了 万来方便观察 沿着花费时间比例最多的函数一路走下去 发现DataReader Read的方法实现分成两部分 自身的托管代码调用和非托管代码调用 分别占用了 %左右的时间和 %左右的时间 有了这个信息后 再通过Reflector分析ADO NET 中的对应函数的实现(VS 自带的Profiler无法分析 NET Framework 的程序 不然直接分析两者时间比例就可以方便地看出问题) 发现非托管代码部分的调用几乎没什么差别 都是调入数据库的客户端非托管DLL 主要差别在托管代码部分 其中引起注意的是ADO NET 增加了SafeHandle Dangerous AddRef/DangerousRelease调用 每一对这样的调用就要花费 %的时间 而每读取一行数据 需要用大约 对这样的调用 经过比较分析 认为问题就是在这里

  由于对数据库的操作和数据填充最终通过调用非托管的数据库引擎来完成 所以需要向非托管的DLL传入托管代码管理的缓存空间 而SafeHandle就是管理这种资源的 在 NET Framework 中 由于缺少SafeHandle类 高负载环境下程序存在表现不稳定的危险 没有完美的解决方法 NET Framework 增加了SafeHandle来保证程序的可靠性 然而 代价就是 万行数据发生 秒钟的时间损失 (后来经开发人员确认 这 秒钟的损失 在下一版本的Framework也可以想办法优化掉!)

   结论和收获

  在跟客户作进一步的交流后 这个问题的结论如下

   MSDN文章的介绍是正确的 如果用文章里面的例子 的确可以看到性能有数量级上的提升

  

   在客户的真实环境中 损失的 秒时间其实不会对最终用户和整个程序造成影响

cha138/Article/program/ASP/201311/21683

相关参考

知识大全 ADO.NET 2.0 数据异步处理改善用户体验

ADO.NET2.0数据异步处理改善用户体验  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  支持

知识大全 ADO.NET 2.0 动态指定 ObjectDataSource 的 SelectMethod

ADO.NET2.0动态指定ObjectDataSource的SelectMethod  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布

知识大全 ADO.NET 2.0 Dataset和Datatable 新功能新

ADO.NET2.0Dataset和Datatable新功能新  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 迈向Data 2.0——在客户端操作ADO.NET数据服务

迈向Data2.0——在客户端操作ADO.NET数据服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 ADO.NET和ADO的比较

ADO.NET和ADO的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 处理ADO与ADO.NET对比介绍

处理ADO与ADO.NET对比介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ADONET统

知识大全 在 ADO 和 ADO.NET 中管理离线数据

在ADO和ADO.NET中管理离线数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  您可以使用

知识大全 ADO.Net与ADO在数据内存中的差异讨论

ADO.Net与ADO在数据内存中的差异讨论  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据

知识大全 Asp.Net中创建和使用Ado.net

Asp.Net中创建和使用Ado.net  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 ADO.NET中的.NET数据提供者

ADO.NET中的.NET数据提供者  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ADONET