可能引发性能问题的几个代码写法总结

开发 后端
本文总结了可能引发性能问题的几个代码写法,如tryparse的使用,IndexOf中单双引号的使用,关闭数据库连接等等。如果你的代码不幸也占了那么一、两个,那么修改并对比一下性能试试看。

可能引发性能问题的几个代码写法,看看你占哪一个.

1. int.Parse() VS int.TryParse()

你是不是正在这样写

  1. int id = 0;  
  2. try{ id = int.Parse(Request["id"]); }  
  3. catch{ id = 0; } 

如果是可以这样试试

  1. int id = 0;  
  2. int.TryParse(Request["id"], out id); 

前一种写法,一旦 Request["id"] 是非数值型的,将引发一个异常,引发异常的开销是非常巨大的,而后一种则不会引发任何异常。

2.string.IndexOf()

你正在这样写吗?

  1. string s = "aaa,bb";  
  2. int pos = s.IndexOf(","); 

其实对于单字符的查找,这样写会更好

  1. string s = "aaa,bb";  
  2. int pos = s.IndexOf(',');  

有人会问如果我要找多个字符呢,那可以试试下面的

  1. string s = "aaa,bb";  
  2. int pos = s.IndexOf("bb", StringComparison.OrdinalIgnoreCase);  

至于 StringComparison 的具体用法可以google或者baidu得到。

3. RegexOptions.Compiled

如果你正在使用正则并且用到了这个参数,那请你慎重,根据个人经验使用这个参数在访问量比较大的情况下可能会引发性能问题,比如cpu偏高。如果你表示怀疑,可以尝试比较使用和不用这个参数的情况下哪个性能会更好。

4.忘记关闭数据库连接

数据库连接是非常好资源的,所以从打开到关闭应该越短越好。想看看有没有忘记关闭,可以通过性能监视器的 .net Data provider for SqlClient ( 假设你用的是sqlserver ) 来查看,具体的参数说明可以通过google和baidu得到。

5.频繁的Response.Write()

 你正在这样做吗?

  1. Response.Write("这是第1行.< br/>");  
  2. Response.Write("这是第2行.< br/>");  
  3. Response.Write("这是第3行.< br/>"); 

此种写法频繁调用Response.Write() ,根据经验,这是相当的耗cpu,改成下面的试试

  1. StringBuilder sb = new StringBuilder();  
  2. sb.Append("这是第1行.< br/>");  
  3. sb.Append("这是第2行.< br/>");  
  4. sb.Append("这是第3行.< br/>");  
  5.  
  6. Response.Write(sb.ToString());  

6. 不必要的重复操作

  1. List< TopicInfo> list = new List< TopicInfo>();  
  2.  
  3. //从数据库得到数据  
  4. list = GetDataFromDB();  
  5. for(int i = 0;i <  list.Count; i++ )  
  6. {  
  7.     TopicInfo item = list[i];  
  8.       
  9.       
  10. }  

上面的代码估计谁都看的出来有什么不好,那下面这个代码呢

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. using System.Text.RegularExpressions;  
  6. using System.Web;  
  7.  
  8. public class UrlUBB  
  9. {  
  10.  
  11.         /// < summary>  
  12.         /// 替换UBB里面的url  
  13.         /// < /summary>  
  14.         /// < param name="content">< /param>  
  15.         /// < returns>< /returns>  
  16.         public static string RegularUrl(string content)  
  17.         {  
  18.             if (string.IsNullOrEmpty(content))  
  19.                 return string.Empty;  
  20.  
  21.             if (content.IndexOf(@"(url=", StringComparison.OrdinalIgnoreCase) == -1 || content.IndexOf(@"(/url)", StringComparison.OrdinalIgnoreCase) == -1)  
  22.                 return content;  
  23.  
  24.             Regex reg = new Regex(@"\(url=(?< url>.[^\)]*)\)(?< name>.[^\(]*)\(/url\)");  
  25.  
  26.             string url = string.Empty;  
  27.             string name = string.Empty;  
  28.             string href = string.Empty;  
  29.  
  30.             MatchCollection matches = reg.Matches(content);  
  31.             foreach (Match m in matches)  
  32.             {  
  33.                 if (m.Success)  
  34.                 {  
  35.                     url = regexUrl(m.Groups["url"].ToString());  
  36.                     name = m.Groups["name"].ToString();  
  37.                     href = string.Format("< a href=\"redirect.aspx?goto={0}\">{1}< /a>", url, name);  
  38.                     content = content.Replace(m.ToString(), href);  
  39.                 }  
  40.             }  
  41.             return content;  
  42.     }  
  43. }  

你是否考虑过这样的写法

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. using System.Text.RegularExpressions;  
  6. using System.Web;  
  7.  
  8. public class UrlUBB  
  9. {  
  10.         private static Regex reg = new Regex(@"\(url=(?< url>.[^\)]*)\)(?< name>.[^\(]*)\(/url\)");  
  11.  
  12.         /// < summary>  
  13.         /// 替换UBB里面的url  
  14.         /// < /summary>  
  15.         /// < param name="content">< /param>  
  16.         /// < returns>< /returns>  
  17.         public static string RegularUrl(string content)  
  18.         {  
  19.             if (string.IsNullOrEmpty(content))  
  20.                 return string.Empty;  
  21.  
  22.             if (content.IndexOf(@"(url=", StringComparison.OrdinalIgnoreCase) == -1 || content.IndexOf(@"(/url)", StringComparison.OrdinalIgnoreCase) == -1)  
  23.                 return content;  
  24.  
  25.  
  26.             string url = string.Empty;  
  27.             string name = string.Empty;  
  28.             string href = string.Empty;  
  29.  
  30.             MatchCollection matches = reg.Matches(content);  
  31.             foreach (Match m in matches)  
  32.             {  
  33.                 if (m.Success)  
  34.                 {  
  35.                     url = regexUrl(m.Groups["url"].ToString());  
  36.                     name = m.Groups["name"].ToString();  
  37.                     href = string.Format("< a href=\"redirect.aspx?goto={0}\">{1}< /a>", url, name);  
  38.                     content = content.Replace(m.ToString(), href);  
  39.                 }  
  40.             }  
  41.             return content;  
  42.     }  
  43. }  

如果你的代码不幸也占了那么一、两个,那么修改并对比一下性能试试看,如果你很幸运的一个也没占,那么恭喜你,你的程序性能应该还不错。

【编辑推荐】

  1. JSP页面Tomcat提高性能之王道
  2. Servlet和JSP性能优化经验谈
  3. 浅谈编写高性能的Javascript代码
  4. J2EE运行环境性能大优化
  5. 提高EJB性能十大技巧
责任编辑:yangsai 来源: 博客园
相关推荐

2019-01-07 14:36:36

Go系统开源库

2010-01-07 11:21:25

2009-04-24 10:49:57

Oracle性能优化错误

2011-05-20 10:05:13

Oracle性能优化

2011-08-23 08:56:30

2022-09-03 15:12:40

AndroidJDK 11升级

2014-10-31 10:04:57

程序员代码

2023-11-16 17:12:33

数据库oracle

2020-11-11 10:00:13

NAT性能内核

2023-11-22 15:34:41

oracleSQL数据库

2013-06-20 09:59:12

Javascriptvar

2015-11-05 09:02:05

Java代码性能优化

2017-11-06 14:33:54

Web开发服务器网络

2019-12-25 09:49:12

WebKitWindowsChrome

2013-04-24 11:33:31

Android开发Android有用习惯

2021-02-22 07:58:47

内存程序变量

2010-07-12 17:28:17

SharePointVS 2010

2022-09-08 09:45:12

微软Windows夏令时

2021-05-11 11:11:00

漏洞网络安全网络攻击

2012-02-08 09:35:23

思科UCS系列B440刀片
点赞
收藏

51CTO技术栈公众号