趁热打铁-一次.Net WebService的性能优化之旅
原文写于:八月 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的性能优化之旅相关推荐
- 下一代 TGW 从13Mpps到50Mpps性能优化之旅
本文作者:janmeshe,腾讯 TEG 后台开发工程师 0 导语 性能优化是一条既充满挑战又充满魔力的道路,非常幸运如今基于 X86 的性能优化方法及工具已经比较成熟,在 TGW 产品架构即将变革之 ...
- Android 性能优化之旅5--电量优化
转载自 Android 性能优化之旅5–电量优化 2.屏幕保持常亮 为了防止屏幕唤醒一瞬间耗电过多,有一些应用,比如游戏.支付页面,需要保持屏幕常亮来节省电量: getWindow().addFlag ...
- 带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
今天我们来聊一下数据库的性能优化,第一部分简单介绍一下性能优化的通用的方法,第二部分我们讲一个实际案例. 性能优化这个事情核心只有一句话,用户响应时间去哪儿了?性能优化很困难的原因在于,为了定位用户响 ...
- 一次MYSQL 服务器性能优化之旅
1.主库性能预警,CPU LOADING 过高a. 读写分离:把读操作(查询类,不是写入/修改后即查询数据的)放到DB2节点中进行: 2.日志文件.数据文件同放在一个磁盘中 /data ,没有分离 . ...
- Android 性能优化之旅5 电量优化
###一.前言 当手机运行的时候,处理各种任务,硬件就会消耗电量.用户可以通过手机自带的电量监测功能来查看电量使用情况: 一旦用户发现你的APP耗电量特别大,那可就麻烦了.因此我们需要在设计app的时 ...
- 阿里三面 Android 研发岗,竟然挂在了性能优化上……
作为一个程序员,性能优化是无法避开的事情,并且性能优化也是软件系统中最有挑战的工作之一,更是每个工程师都需要掌握的核心技能. 性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志即可直 ...
- .Net+SQL Server企业应用性能优化笔记3——SQL查询语句
在上一篇文章中我们使用了几种方法来确定瓶颈,找到瓶颈,下面再回顾一下: LoadRunner压力测试+Windows计数器,这种方法主要是找出大概的性能问题是在哪台服务器,主要是哪个资源紧张. ANT ...
- 全网最全性能优化总结!!(冰河吐血整理,建议收藏)
大家好,我是冰河~~ 随着互联网的高速发展,互联网行业已经从IT时代慢慢步入到DT时代.对于Java程序员的要求越来越高,只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位,大量招聘岗位显示:如果 ...
- Tair LDB基于Prefixkey的范围查找性能优化项目中期总结
"Tair LDB基于Prefixkey的范围查找性能优化"这个项目刚好进行了一个月,这一个月主要是熟悉项目.掌握项目和提出设计方案的过程,下面从几个方面总结下个人在该项目上所做的 ...
最新文章
- 网站优化中能有效提升网站打开速度的技巧有哪些?
- mysql 唯一索引 性能_普通索引和唯一索引的区别、性能差异,以及其他索引简介...
- Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
- Bug之本地可以发送邮件 测试服不行
- 将COM+ Events进行到底[转]
- 如何用智能有效感知城市?城市大脑三大AI产品来了
- python中rim的用法_Python并发开发简介
- windows系统查找文件-通配符的使用
- 使用SQL编程创建100万条数据测试索引
- 系统架构设计-项目管理
- Flutter绘制虚线
- c语言数字的写法田字格,《国家规定的汉字笔顺规则》及田字格里写数字1~10的标准格式...
- 《nik collection》怎么用
- jmeter 生成随机数(手机号)随机中文字符
- 海康球机时间同步配置
- vue中下载图片跨域
- 计算机游戏 英文作文,电脑游戏英语作文
- 英华鸿蒙幼儿园一日活动,一日生活常规教研活动——记东升丰乐幼儿园第七次教研活动...
- LR的日志,使用以及方法
- Word转pdf一个方法就可以完成~手机电脑都可以免费使用~办公必备