可能引发性能问题的几个代码写法,看看你占哪一个.
1. int.Parse() VS int.TryParse()
你是不是正在这样写
- int id = 0;
- try{ id = int.Parse(Request["id"]); }
- catch{ id = 0; }
如果是可以这样试试
- int id = 0;
- int.TryParse(Request["id"], out id);
前一种写法,一旦 Request["id"] 是非数值型的,将引发一个异常,引发异常的开销是非常巨大的,而后一种则不会引发任何异常。
2.string.IndexOf()
你正在这样写吗?
- string s = "aaa,bb";
- int pos = s.IndexOf(",");
其实对于单字符的查找,这样写会更好
- string s = "aaa,bb";
- int pos = s.IndexOf(',');
有人会问如果我要找多个字符呢,那可以试试下面的
- string s = "aaa,bb";
- 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()
你正在这样做吗?
- Response.Write("这是第1行.< br/>");
- Response.Write("这是第2行.< br/>");
- Response.Write("这是第3行.< br/>");
此种写法频繁调用Response.Write() ,根据经验,这是相当的耗cpu,改成下面的试试
- StringBuilder sb = new StringBuilder();
- sb.Append("这是第1行.< br/>");
- sb.Append("这是第2行.< br/>");
- sb.Append("这是第3行.< br/>");
- Response.Write(sb.ToString());
6. 不必要的重复操作
- List< TopicInfo> list = new List< TopicInfo>();
- //从数据库得到数据
- list = GetDataFromDB();
- for(int i = 0;i < list.Count; i++ )
- {
- TopicInfo item = list[i];
- }
上面的代码估计谁都看的出来有什么不好,那下面这个代码呢
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Web;
- public class UrlUBB
- {
- /// < summary>
- /// 替换UBB里面的url
- /// < /summary>
- /// < param name="content">< /param>
- /// < returns>< /returns>
- public static string RegularUrl(string content)
- {
- if (string.IsNullOrEmpty(content))
- return string.Empty;
- if (content.IndexOf(@"(url=", StringComparison.OrdinalIgnoreCase) == -1 || content.IndexOf(@"(/url)", StringComparison.OrdinalIgnoreCase) == -1)
- return content;
- Regex reg = new Regex(@"\(url=(?< url>.[^\)]*)\)(?< name>.[^\(]*)\(/url\)");
- string url = string.Empty;
- string name = string.Empty;
- string href = string.Empty;
- MatchCollection matches = reg.Matches(content);
- foreach (Match m in matches)
- {
- if (m.Success)
- {
- url = regexUrl(m.Groups["url"].ToString());
- name = m.Groups["name"].ToString();
- href = string.Format("< a href=\"redirect.aspx?goto={0}\">{1}< /a>", url, name);
- content = content.Replace(m.ToString(), href);
- }
- }
- return content;
- }
- }
你是否考虑过这样的写法
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Web;
- public class UrlUBB
- {
- private static Regex reg = new Regex(@"\(url=(?< url>.[^\)]*)\)(?< name>.[^\(]*)\(/url\)");
- /// < summary>
- /// 替换UBB里面的url
- /// < /summary>
- /// < param name="content">< /param>
- /// < returns>< /returns>
- public static string RegularUrl(string content)
- {
- if (string.IsNullOrEmpty(content))
- return string.Empty;
- if (content.IndexOf(@"(url=", StringComparison.OrdinalIgnoreCase) == -1 || content.IndexOf(@"(/url)", StringComparison.OrdinalIgnoreCase) == -1)
- return content;
- string url = string.Empty;
- string name = string.Empty;
- string href = string.Empty;
- MatchCollection matches = reg.Matches(content);
- foreach (Match m in matches)
- {
- if (m.Success)
- {
- url = regexUrl(m.Groups["url"].ToString());
- name = m.Groups["name"].ToString();
- href = string.Format("< a href=\"redirect.aspx?goto={0}\">{1}< /a>", url, name);
- content = content.Replace(m.ToString(), href);
- }
- }
- return content;
- }
- }
如果你的代码不幸也占了那么一、两个,那么修改并对比一下性能试试看,如果你很幸运的一个也没占,那么恭喜你,你的程序性能应该还不错。
【编辑推荐】