.NET中一些常见代码的性能问题

问题|性能

1、StringBuilder和String(差别很大)
   string s = "";
   long t1 = System.DateTime.Now.Ticks;
   for(int i=0;i<10000;i++)s += Convert.ToString(i);
   long t2 = System.DateTime.Now.Ticks;

   long t3 = System.DateTime.Now.Ticks;
   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   for(int i=0;i<10000;i++)sb.Append(Convert.ToString(i));
   string s1 = sb.ToString();
   long t4 = System.DateTime.Now.Ticks;

   long t5 = System.DateTime.Now.Ticks;
   System.Text.StringBuilder sb1 = new System.Text.StringBuilder(5000);
   for(int i=0;i<10000;i++)sb1.Append(i);
   string s2 = sb1.ToString();
   long t6 = System.DateTime.Now.Ticks;

   long t7 = System.DateTime.Now.Ticks;
   System.Text.StringBuilder sb2 = new System.Text.StringBuilder(10000);
   for(int i=0;i<10000;i++)sb2.Append(i);
   string s3 = sb2.ToString();
   long t8 = System.DateTime.Now.Ticks;

   ListViewItem item1 = result.Items.Add("使用String类,利用operator +进行操作");
   item1.SubItems.Add(Convert.ToString((t2-t1)/10000));

   ListViewItem item2 = result.Items.Add("使用StringBuilder类,不对初始大小赋值");
   item2.SubItems.Add(Convert.ToString((t4-t3)/10000));

   ListViewItem item3 = result.Items.Add("使用StringBuilder类,对初始大小赋值为申请数量的1/2");
   item3.SubItems.Add(Convert.ToString((t6-t5)/10000));

   ListViewItem item4 = result.Items.Add("使用StringBuilder类,对初始大小赋值为申请数量");
   item4.SubItems.Add(Convert.ToString((t8-t7)/10000));

  2、异常对性能的影响,当然,下面这个例子没有进行异常的分发、捕获等,所以时间不长。

   int j = 0;
   long t1 = System.DateTime.Now.Ticks;
   for(int i = 0; i < 10000; i++)
   {
    try
    {  
     j = i;
     throw new System.Exception();
    }
    catch {}
   } 
   long t2 = System.DateTime.Now.Ticks;

   long t3 = System.DateTime.Now.Ticks;
   for(int i = 0; i < 10000; i++)
   {
    try
    {  
     j = i;
     //throw new System.Exception();
    }
    catch {}
   } 
   long t4 = System.DateTime.Now.Ticks;

   result.Items.Clear();
   ListViewItem item1 = result.Items.Add("抛出10000个异常");
   item1.SubItems.Add(Convert.ToString((t2-t1)/10000));
   ListViewItem item2 = result.Items.Add("屏蔽异常");
   item2.SubItems.Add(Convert.ToString((t4-t3)/10000));

  3、使用Foreach循环与使用For循环(差别较大)

   string s = "monkeys!";
   int dummy = 0;

   System.Text.StringBuilder sb = new System.Text.StringBuilder(s);
   for(int i = 0; i < 1000000; i++)sb.Append(s);
   s = sb.ToString();

   long t1 = System.DateTime.Now.Ticks;
   foreach (char c in s) dummy++;
   long t2 = System.DateTime.Now.Ticks;

   dummy = 0;
   long t3 = System.DateTime.Now.Ticks;
   for (int i = 0; i < 1000000; i++)dummy++;
   long t4 = System.DateTime.Now.Ticks;

   result.Items.Clear();
   ListViewItem item1 = result.Items.Add("使用foreach循环");
   item1.SubItems.Add(Convert.ToString((t2-t1)/10000));
   ListViewItem item2 = result.Items.Add("使用for循环");
   item2.SubItems.Add(Convert.ToString((t4-t3)/10000));

  4、LateBinding和DirectCall的比较(差别也比较大)

   long t1 = System.DateTime.Now.Ticks;
   LateBindingTest lbt = new LateBindingTest();

   for(int i=0;i<100000;i++)
   {
    string s = lbt.GetSomewhat();
   }
   long t2 = System.DateTime.Now.Ticks;

   long t3 = System.DateTime.Now.Ticks;
   Type t = Type.GetType("PerfDemo.LateBindingTest");
   MethodInfo mi = t.GetMethod("GetSomewhat");  

   for(int i=0;i<100000;i++)
   {
    object s2 = mi.Invoke(lbt,null);
   }
   long t4 = System.DateTime.Now.Ticks;

   result.Items.Clear();
   ListViewItem item1 = result.Items.Add("直接调用class的方法(微秒)");
   item1.SubItems.Add(Convert.ToString((t2-t1)/10));
   ListViewItem item2 = result.Items.Add("采用迟绑定的方式class的方法(微秒)");
   item2.SubItems.Add(Convert.ToString((t4-t3)/10));

  5、这是上面例子中使用的class定义:

 public class LateBindingTest
 {
  public string GetSomewhat()
  {
   return "hello,fqq!";
  }
 }

  6、大家可以结合taskmgr和PerformanceMonitor来进行监视,结论还是比较有意思的

时间: 2024-08-25 15:19:37

.NET中一些常见代码的性能问题的相关文章

Java开发中程序和代码性能优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升,在开发中注意这些,更多的是可以保持一种性能优先的意识. 一 条件控制语句中的优化 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();i++) 可以改为 //我的电脑上,测试数量级在10^7,速度提升一倍. for(int i=0,len=li

PHP编程中的常见漏洞和代码实例_php技巧

不是固若金汤,随着PHP的广泛运用,一些黑客们也在无时不想找PHP的麻烦,通过PHP程序漏洞进行攻击就是其中一种.在节,我们将从全局变量,远程文件,文件上载,库文件,Session文件,数据类型和容易出错的函数这几个方面分析了PHP的安全性. 如何通过全局变量进行攻击? PHP中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型根据上下文环境自动确定.从程序员的角度来看,这无疑是一种极其方便的处理方法.一旦一个变量被创建了,就可以在程序中的任何地方使用.这个特点导致的结果就是程序员很

JPA2.1 中三个提升应用性能的新功能

经常在网上看到开发者们抱怨 JPA 性能低下的帖子或文章,但如果仔细查看这些性能问题,常会发现导致问题的根本原因大致包括以下几个: 使用过多的 SQL 查询从数据库中获取所需的实体信息,即我们常说的n+1查询问题 逐个更新实体,而不是使用单条语句进行更新 使用 Java 应用程序而非数据库进行大量数据处理 JPA提供了处理这类问题的方法,并给 JPA2.1 增加了一些额外功能,可以极大地提升性能表现,笔者将在本文中解释如何利用 JPA2.1 的功能避免上述问题. 顺便提一下,如果想了解Java项

java中什么是代码重构,什么时候需要代码重构

问题描述 java中什么是代码重构,什么时候需要代码重构 java中什么是代码重构,什么时候需要代码重构 代码重构一般发生在地方,代码重构需要注意什么问题 解决方案 当你的代码不好维护,不好升级,不好管理的时候肯定是需要重新构造.每次重构都会学到很多东西.开始写代码如果质量高,需要重构的量就少.反之就多.参考这个:http://blog.mkfree.com/posts/30 解决方案二: 重构就是在不改变软件系统外部行为的前提下,改善它的内部结构.重构代码不仅仅限于java开发中,任何开发语言

如何改进javascript代码的性能_javascript技巧

本来在那片编写可维护性代码文章后就要总结这篇代码性能文章的,耽搁了几天,本来也是决定每天都要更新一篇文章的,因为以前欠下太多东西没总结,学过的东西没去总结真的很快就忘记了,记录一下在你脑力留下更深的印象,特别是这些可维护性代码,性能什么的,当在你脑子里形成一种习惯了,那你就牛了!这里也要给初学者一个建议:多总结你学过的东西,因为这其实也是在学习新知识! 好,进入我们的主题:如何提高JS代码的性能. 1.优化DOM交互 DOM与我们的页面紧密相关,浏览器渲染页面也就是在渲染解析后的DOM元素,DO

敏捷过程中如何保证代码质量

本文目录:一.为什么要做代码质量分析二.常见的代码质量分析工具三.DevOps平台中的代码质量分析四.DevOps平台中如何为代码质量提供保障 一.为什么要做代码质量分析 本文讲的是敏捷过程中如何保证代码质量,在软件开发过程中,当一个功能开发完成后,如何去保证代码是可用的.没问题的?一般情况下,基本都会有单元测试.每日构建.功能测试等环节来保证.但是,保证代码可用就够了吗?显然不是. 一个软件项目开发完一个版本会有下一个版本,会有新的需求,原来的功能也可能会变更.你写的代码可能会被别人使用,你也

ASP.NET Whidbey 中新的代码编译功能

asp.net|编译 ASP.NET Whidbey 中新的代码编译功能G. Andrew DuthieGraymad Enterprises, Inc. 2003 年 10 月 摘要:了解如何利用 ASP.NET Whidbey 更轻松地使用代码.Code 目录会自动为您的站点编译代码,而预编译会使部署工作更容易. 下载本文的源代码.(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解.) 目录简介新的模块化代码模型\Code 目录利息计算器预编译支持在位预编

Asp.NET中常用的一些优化性能的方法

asp.net|性能|优化 Asp.NET中常用的一些优化性能的方法 ASP.NET 的缓存机制相比ASP有很大的改进,本文档除对常用优化方法进行总结介绍外,强调了如何使用ASP.NET的缓存来获得最佳性能. 1:不要使用不必要的session和ASP中一样,在不必要的时候不要使用Session. 可以针对整个应用程序或者页面禁用会话状态: l 禁用页面的会话状态 l 禁用应用程序的会话状态 在应用程序的Web.Config文件的sessionstate配置节中,将mode属性设置为off. 即

产品用户在硬件防火墙测评中的常见误区

不是什么事都可成功的,都有失败的记录.比如硬件防火墙测评,本文尝试着整理了产品用户在硬件防火墙测评中的常见误区,将于大家进行探讨. 误区一:误信含糊实验条件的惊人数字 亲阅过无数防火墙产品广告,一个个白纸黑字标称的4G吞吐量让人炫目,但如果把"64字节小包"."线速"."坚持几分钟"之类字眼抛出来,销售人员就会对吞吐量自己先变的吞吞吐吐起来.所以不能轻信厂商提供的各项数据,必须拿标准实验条件的测试结果来比对,或者重新搭建环境亲自来测试. 误区二: