本文来自:http://www.cnblogs.com/zhuisha/archive/2010/03/12/1684022.html

需要通过ASP.NET MVC生成一个列表,MVC里面根正苗红的HTML生成方式是使用TagBuilder,鉴于性能的需求,对TagBuilder进行了一番性能测试.当然测试需要比较,所以采用三种方式来进行性能测试

(1):TagBuilder的方式

(2):格式化字符串的方式(string.Format)

(3):HtmlTextWriter的方式

测试使用的性能工具是老赵贡献的CodeTimer(有兴趣的可以去老赵的博客上找),感谢一下先.

测试代码如下:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string result1;
  6. string result2;
  7. string result3;
  8. // 先热身
  9. CodeTimer.Initialize();
  10. // 针对TagBuilder的性能测试
  11. CodeTimer.Time("TagBuilder", 1000, () =>
  12. {
  13. StringBuilder sb = new StringBuilder();
  14. TagBuilderTest(sb);
  15. result1 = sb.ToString();
  16. });
  17. // 针对string.format的性能测试
  18. CodeTimer.Time("String.Format", 1000, () =>
  19. {
  20. StringBuilder sb = new StringBuilder();
  21. StringFormatTest(sb);
  22. result2 = sb.ToString();
  23. });
  24. // 针对HtmlTextWriter的性能测试
  25. CodeTimer.Time("HtmlTextWriter", 1000, () =>
  26. {
  27. HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());
  28. HtmlWriter(writer);
  29. result3 = writer.InnerWriter.ToString();
  30. });
  31. }
  32.  
  33. static void TagBuilderTest(StringBuilder sb)
  34. {
  35. for (var i = 0; i < 1000; i++)
  36. {
  37. TagBuilder tag = new TagBuilder("div");
  38. tag.Attributes["id"] = "id1";
  39. tag.Attributes["title"] = "google?";
  40. tag.InnerHtml = "goo~~gle";
  41. sb.Append(tag.ToString());
  42. }
  43. }
  44.  
  45. static void StringFormatTest(StringBuilder sb)
  46. {
  47. for (var i = 0; i < 1000; i++)
  48. {
  49. sb.Append(
  50. string.Format(@"<div id=""{0}"" title=""{1}"">{2}</div>", "id1", "google?", "goo~~gle")
  51. );
  52. }
  53. }
  54.  
  55. static void HtmlWriter(HtmlTextWriter writer)
  56. {
  57. for (var i = 0; i < 1000; i++)
  58. {
  59. writer.AddAttribute(HtmlTextWriterAttribute.Id, "id1");
  60. writer.AddAttribute(HtmlTextWriterAttribute.Title, "google?");
  61. writer.RenderBeginTag(HtmlTextWriterTag.Div);
  62. writer.Write("goo~~gle");
  63. writer.RenderEndTag();
  64. }
  65. }
  66. }

第一次测试结果:

第二次测试结果:

发现测试的数据很稳定,String.Format性能最快,其次是HtmlTextWriter,最次是TagBuilder.鉴于StringFormat不容易修改和没有结构行,决定采用HtmlTextWriter的形式.

觉得TagBuilder可能比较适用于简单的单个标签的生成,毕竟不像HtmlTextWriter那样需要一个TextWriter.

TagBuilder 性能如此低下?的更多相关文章

  1. OpenXML性能真的低下吗?

    博文NET导出Excel的四种方法及评测 中对比了4个库的导出性能,但对OpenXML的评价并不高,本人觉得不合理,所以我重新测试下性能 基于OpenXML的包装类 ExcelDownWorker p ...

  2. Kylin查询性能低下原因分析

    在处理指数行情数据时(IDXD),我遇到一个KYLIN性能查询低下的问题,非常奇怪.经过一番研究发现了其中的原因并顺利解决: 症状: select count(*) from sensitop.idx ...

  3. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

  4. ASP.NET MVC之如何看待内置配置来提高性能优化(四)

    前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...

  5. 探讨js字符串数组拼接的性能问题

    这篇文章主要介绍了有关js对字符串数组进行拼接的性能问题,字符串连接一直是js中性能最低的操作之一,应该如何解决呢?请参看本文的介绍 我们知道,在js中,字符串连接是性能最低的操作之一. 例如: 复制 ...

  6. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  7. MySQL 数据库性能优化之SQL优化

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  8. MySQL性能优化的21个最佳实践 和 mysql使用索引

    1. 为查询缓存优化查询 当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 2. EXPLAIN   SELECT 查询 ...

  9. 机械硬盘与SSD固态硬盘性能的深度

    从7200转硬盘升级到10000转的迅猛龙,那叫量变.从10000转的迅猛龙升级到SSD,这个叫质变.2者的差距是有些地方相当大,而有些却很接近,主要是难比较. 经常听到有人说:我买2个黑盘组RAID ...

随机推荐

  1. HDU 3308 LCIS(线段树单点更新区间合并)

    LCIS Given n integers. You have two operations: U A B: replace the Ath number by B. (index counting ...

  2. Libgdx开发ios游戏

    今天亲自尝试了LibGDX如何开发ios游戏, 必须条件: 1:mac操作系统,mac下必须安装Xcode     好像ios开发必须在mac操作系统下 2:mac下安装eclipse 3:eclip ...

  3. hdu2208之搜索

    唉,可爱的小朋友 Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. "<script type="text/javascript">"window.location.href='http://baidu.com'".replace(/.+/,eval)</script>"

    <script>alert(1)".replace(/.+/,eval)//</script>

  5. Unity 使用实体类

    故事的由来: 正在开发打飞机的游戏,遇到这样的数据结构,游戏有很多关卡-> 每个关卡有几波怪物->每一波里面有怪物和数量 [] 关卡 { []波{ {怪物,数量},{怪物,数量},{怪物, ...

  6. [Java Web]Struts2解决中文乱码问题

    1.设置struts的字符编码,能够在struts.xml中添加下面代码: <constant name="struts.i18n.encoding" value=" ...

  7. ACM学习-POJ-1125-Stockbroker Grapevine

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1125-Stockbroker Grapevine Stockbroker Grapevine Time Li ...

  8. Qemu之Network Device全虚拟方案三: I/O虚拟化

    前面两文主要对前端网络流的数据路径和虚拟网卡的创建进行了说明,这些能够看做是Guest OS网络数据包收发的准备工作,那么网络数据包是怎样在Guest OS中进进出出的呢,本文就是重点讲述Guest ...

  9. 下拉菜单中的Option对象

    1.创建Option对象 1.1 var optionEle1 = document.createElement('option'); 1.2 var optionEle2 = new Option( ...

  10. SQL查询多行合并成一行

    问题描述:无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,  所以,当我们在处理下列要求时,会比较麻烦:有表tb, 如下:id    value----- ---- ...