原文写于:八月 9 2011 11:08 上午

公司里新上了一个项目,在做性能测试的时候发现一个奇怪的问题,跑同一个流程,在一个48核(HP580 G7 PC server)的服务器上耗时120秒,而在一个4核心的PC机上只要90秒,带着这样的疑问,公司请了微软的相关工程师来解决此问题。

经过一天的跟踪调试和优化,把耗时降至70几秒,这其中过程包含几个.net对象的优化,确实效果很明显。此文是阶段性结论的一个笔记,也蛮具有指导意义。

一、DataView.ToTable()后的性能问题

工程师在跟踪代码的时候发现处理这个方法的时候很慢,占居了整个逻辑代码的大部分时间。优化这个方法后效果很明显。

查了MSDN,官方并没有给出DataView.ToTable()方法关于性能方面的提示,但是要MSDN看这个方法时,发现老外在06年的时候已经在下面回了一段代码,通过三个方式执行这个方法,发现效率上差异很大。 (MSDN:DataView.ToTable())。

我复制代码,创建了一个新的工程,确实可以重现问题。整个过程大概如下:

背景是有一个有500000条数据的DataTable,然后把这个DataTable中的数据赋给DataView,然后从这个DataView通过ToTable()方法,把数据转给另外一个同架构的DataTable。

第一种方式 创建目标DataTable对象,直接通过toTable()方法转换。过程耗时:27.0504秒。

第二种方式 创建目标DaTaTable后,对其设置PrimaryKey。然后通过下面代码向目标表添加数据。

foreach (DataRow dr in ds.Tables[0].Rows)

{

DataRow[] drrepetido = dsRes.Tables[0].Select("valor=" + dr["Valor"]);

if (drrepetido.Length == 0)

dsRes.Tables[0].ImportRow(dr);

}

过程耗时:11.7624秒。

第三种方式 不根据原架构创建目标DataTable,全新实例化DataTable对象,然后向其添加对应列,然后创建哈希表,循环写入目标表,代码如下:

DataTable dt = new DataTable();

dt.Columns.Add("valor", ds.Tables[0].Columns["valor"].DataType);

Hashtable ht = new Hashtable();

foreach (DataRow dr in ds.Tables[0].Rows)

{

if (!ht.ContainsKey(dr[0]))

{

ht.Add(dr[0], null);

DataRow newRow = dt.NewRow();

newRow[0] = dr[0];

dt.Rows.Add(newRow);

}

}

过程耗时:0.2184秒。

三种方式对比,发现非常恐怖。但是微软好像还没有给出原因。

二、StringBuilder()使用不档带来的性能问题

关于StringBuilder之前也看过很多文章,这次开发商程序中的问题和以前的类似,实例化时没有设置一个比较推荐的长度值,导致在循环体内不断appand()后,StringBuilder对象不断被GC处理。从而消耗了很多时间。

关于StringBuilder()对象,还是再多加几句吧。其默认维护的Capacity值是16。

因为StringBuilder对象的创建代价较大,在字符串连接目标较少的情况下,过度滥用StringBuilder会导致性能的浪费而非节约。只有大量的或者无法预知次数的字符串操作,才考虑以StringBuilder来实现。  String类型的“+”连接操作,实际上是重载操作符“+”调用String.Concat来操作,而编译器则会优化这种连接操作的处理,编译器根据其传入参数的个数,一次性分配相应的内存,并依次拷入相应的字符串。 StringBuilder在使用上,最好指定合适的容量值,否则由于默认容量不足而频繁的进行内存分配操作,是不妥的实现方法。  通常情况下,进行简单字符串连接时,应该优先考虑使用String.Concat和String.Join等操作来完成字符串的连接,但是应该留意String.Concat可能存在的装箱操作。

三、拆装箱带来性能问题

如果用StringBuilder.toString().trim()来判断StringBuilder是否有值的情况,可以用StringBuilder.Lenth()来代替。

其它等等

转载于:https://www.cnblogs.com/redroot/archive/2013/01/24/2875843.html

趁热打铁-一次.Net WebService的性能优化之旅相关推荐

  1. 下一代 TGW 从13Mpps到50Mpps性能优化之旅

    本文作者:janmeshe,腾讯 TEG 后台开发工程师 0 导语 性能优化是一条既充满挑战又充满魔力的道路,非常幸运如今基于 X86 的性能优化方法及工具已经比较成熟,在 TGW 产品架构即将变革之 ...

  2. Android 性能优化之旅5--电量优化

    转载自 Android 性能优化之旅5–电量优化 2.屏幕保持常亮 为了防止屏幕唤醒一瞬间耗电过多,有一些应用,比如游戏.支付页面,需要保持屏幕常亮来节省电量: getWindow().addFlag ...

  3. 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅

    今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...

  4. 一次MYSQL 服务器性能优化之旅

    1.主库性能预警,CPU LOADING 过高a. 读写分离:把读操作(查询类,不是写入/修改后即查询数据的)放到DB2节点中进行: 2.日志文件.数据文件同放在一个磁盘中 /data ,没有分离 . ...

  5. Android 性能优化之旅5 电量优化

    ###一.前言 当手机运行的时候,处理各种任务,硬件就会消耗电量.用户可以通过手机自带的电量监测功能来查看电量使用情况: 一旦用户发现你的APP耗电量特别大,那可就麻烦了.因此我们需要在设计app的时 ...

  6. 阿里三面 Android 研发岗,竟然挂在了性能优化上……

    作为一个程序员,性能优化是无法避开的事情,并且性能优化也是软件系统中最有挑战的工作之一,更是每个工程师都需要掌握的核心技能. 性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志即可直 ...

  7. .Net+SQL Server企业应用性能优化笔记3——SQL查询语句

    在上一篇文章中我们使用了几种方法来确定瓶颈,找到瓶颈,下面再回顾一下: LoadRunner压力测试+Windows计数器,这种方法主要是找出大概的性能问题是在哪台服务器,主要是哪个资源紧张. ANT ...

  8. 全网最全性能优化总结!!(冰河吐血整理,建议收藏)

    大家好,我是冰河~~ 随着互联网的高速发展,互联网行业已经从IT时代慢慢步入到DT时代.对于Java程序员的要求越来越高,只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位,大量招聘岗位显示:如果 ...

  9. Tair LDB基于Prefixkey的范围查找性能优化项目中期总结

    "Tair LDB基于Prefixkey的范围查找性能优化"这个项目刚好进行了一个月,这一个月主要是熟悉项目.掌握项目和提出设计方案的过程,下面从几个方面总结下个人在该项目上所做的 ...

最新文章

  1. 网站优化中能有效提升网站打开速度的技巧有哪些?
  2. mysql 唯一索引 性能_普通索引和唯一索引的区别、性能差异,以及其他索引简介...
  3. Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
  4. Bug之本地可以发送邮件 测试服不行
  5. 将COM+ Events进行到底[转]
  6. 如何用智能有效感知城市?城市大脑三大AI产品来了
  7. python中rim的用法_Python并发开发简介
  8. windows系统查找文件-通配符的使用
  9. 使用SQL编程创建100万条数据测试索引
  10. 系统架构设计-项目管理
  11. Flutter绘制虚线
  12. c语言数字的写法田字格,《国家规定的汉字笔顺规则》及田字格里写数字1~10的标准格式...
  13. 《nik collection》怎么用
  14. jmeter 生成随机数(手机号)随机中文字符
  15. 海康球机时间同步配置
  16. vue中下载图片跨域
  17. 计算机游戏 英文作文,电脑游戏英语作文
  18. 英华鸿蒙幼儿园一日活动,一日生活常规教研活动——记东升丰乐幼儿园第七次教研活动...
  19. LR的日志,使用以及方法
  20. Word转pdf一个方法就可以完成~手机电脑都可以免费使用~办公必备

热门文章

  1. R之ddlpy函数学习[转载]
  2. 使用salt-api来搭建salt自动化平台
  3. 《图解CSS3:核心技术与案例实战》——1.1节什么是CSS3
  4. 《CCNP SWITCH 300-115学习指南》——导读
  5. 探究chrome下的开发工具的各功能
  6. spring mvc ajaxform IE下提示下载问题解决
  7. Shell 文本操作利器收集
  8. linux mint 13 input method of chinese
  9. shell入门基础必备
  10. CentOS6.9下手动编译并安装Python3.7.0