惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
V
V2EX
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
腾讯CDC
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Help Net Security
博客园 - Franky
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏

博客园 - 淡泊江湖

[原]每日头条(200709)——自有新视角:一条热点新闻、一项业界动态、一个另类点子……,关注我们的社会、关注我们的行业、关注我们的思想 [原]TerryLee“ASP.NET AJAX入门系列”源代码发布! [实践篇]+[转]用C#实现HTTP协议下的多线程文件传输 [转]C#编程规范 [转]袁红岗的编程感悟(搜藏) - 淡泊江湖 - 博客园 [原]IE7安装后的初步感受:IE的是是非非(更新:诸多原因,最终卸载) [转]我对J2EE和.NET的一点粗陋理解(搜藏) [转]我的IT学习生活(搜藏) [转]程序员的十种级别,看看你属于哪一种?(搜藏) [转]一篇感人肺腑的、真实的人生独白, 同行们不得不读的文章!(搜藏) [转]集成技术:.NET单挑J2EE [转]每个.Net开发人员应该下载的十种必备工具 [转]网页设计中的功能与美化(搜藏) [转]写Java 程序最容易犯的21 种错误实例分析(搜藏) [转]Java代码编写的30条建议(搜藏) [原]"LM/w3svc/1/root /***" 别名已存在 错误解决方法(搜藏) - 淡泊江湖 [转]浅谈数据库设计技巧(上)、(下)(搜藏) 2006年德国世界杯(第22天)——送别心目中的英雄们!!! 2006年德国世界杯(第13、14天)——送走心目中的英雄!
[原]DataTable性能问题
淡泊江湖 · 2007-07-19 · via 博客园 - 淡泊江湖

      这段时间在做一个数据分析的工具,需要计算和过滤大量数据。

      考虑到DataTable提供的强大功能和灵活性,数据的处理大都在DataTable中进行处理。
 
      但近段时间测试中,发现了性能的缺陷问题。于是,就开始研究性能的提高问题。

      我先给初步推测:现有模式下,程序即时优化,优化的幅度不会太大,除非改变现有的操作模式。

      于是首先,从其中一个过程是先从CSV文件读取原始数据的地方着手。一直采用Stream(流)的读取方式,怀疑是不是这里成为性能的瓶颈。于是改用ODBC:Microsoft Text Driver的方式:这样就可以像操作数据库一样来操作CSV里的数据了,通过sql语句来获取数据。但是,通过比较这两种方式后,得出的结论是:因为业务上的需要,对数据进行多次分组合并,反而用sql语句实现效率不如Stream方式,而且没有自己来操作灵活,受限于sql语句。<这里是应该写得详细些,以后注意>

      于是,否定了前面的这种推测;那影响性能的真正原因是什么呢?

      接下来,就一行行代码进行浏览,终于确定影响性能的位置,是出项在两层循环出现的位置:
 for (int j = 0; j < intSpacingValueNum; j++)
{
  for (int i = 1; i < aryline.Length; i++)
  {
    dtAll[intCSVRowCountTemp, i] += Convert.ToDecimal(aryline[i]);
      //DataTable和二维数组的差异,是每次指定“行号、列号”,取相应元素有一点差异,然而在多次的循环操作中被放大了;这可能和DataTable和二维数组自身的结构有关,没做深究
  }   
 }
      问题就出在循环里的这条语句, 因为i和j的取值很大,当i=50000,j=200,循环里面的这句就要操作1000000遍;所以性能上的丝毫差别,都会被无限放大;于是尝试,用数组来替代:
decAll[intCSVRowCountTemp, i] += Convert.ToDecimal(aryline[i]);性能立刻提高了十倍,之前用20-30秒,现在2-3秒就处理完毕。

      结论:功能和性能永远是一对矛盾体,DataTabel功能强大必然要性能差些;数组结构则反之。
      我想大家平时DataTable一定没少用,希望能给大家提个醒,其实各种数据结构都有其最佳用途,要根据需要有针对性地进行选择。