zoukankan      html  css  js  c++  java
  • 可能引发性能问题的几个写法,看看你占哪一个.

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

    你是不是正在这样写

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

    4

    如果是可以这样试试

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

    3  

    前一种写法,一旦 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偏高。如果你表示怀疑,可以尝试比较使用和不用这个参数的情况下哪个性能会更好。

    这个更正一下:  RegexOptions.Compiled 作为全局静态变量的参数,如下:

     public class UrlUBB

    {
            
    // 替换ubb中的,格式 [url=http://cnblogs.com/]博客园[/url]
            private static Regex reg = new Regex(@"\[url=(?<url>.*?)\](?<name>.*?)\[/url\]",RegexOptions.Compiled);

            
    public static string RegularUrl(string content)
            {
                
    //在这里使用全局定义的 reg 

    ......此处代码略
             }

    }

    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/>");
    4 
    5 
    6 

    7  

    此种写法频繁调用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 
     7 
     8 
     9 Response.Write(sb.ToString());

    10  


    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;
        }

    }

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

    对于怎么样的文章才应该放博客园首页,争端好像一直不断。虽然本文不是什么大作,也没有华丽的词藻,但毕竟是个人原创,经验之谈,所以斗胆放在首页,算是支持一下原创也不为过吧。如果你有更好的性能体验或者的程序的优化经验,不妨也拿出来共享一下,这对你好、我好,大家好才是真的好嘛!

  • 相关阅读:
    ArcMap和ArcGIS Pro加载百度地图
    智能家居系列之——WIFI小车
    关于GIS中Scale和Resolution的那些事儿
    git cherry-pick
    虚拟DOM与DOM diff
    变量提升
    如果判定 this 又混乱了,就从头再读一遍……
    js 高程 Array
    Js高程-DOM
    剑指 Offer 15. 二进制中1的个数
  • 原文地址:https://www.cnblogs.com/gezifeiyang/p/1512860.html
Copyright © 2011-2022 走看看