• Convert、Parse、TryParse、(int)区别及可能引发性能问题


    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 四者都可以解释为将类型转换为 int,那它们的区别是什么呢?

    Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:

    Convert.ToInt32 参数为 null 时,返回 0;
    int.Parse 参数为 null 时,抛出异常。

    Convert.ToInt32 参数为 "" 时,抛出异常;
    int.Parse 参数为 "" 时,抛出异常。

    Convert.ToInt32 可以转换的类型较多;
    int.Parse 只能转换数字类型的字符串。
    int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。

    int m;
    if(int.TryParse("2"),out m)
    {
    ...
    }
    返回true ,运行{}内,并给m赋值为2;

    if(int.TryParse("ddd"),out m)
    {
    ...
    }
    返回false,不运行if{}内,并给m赋值为0;

    (int) 属 cast 转换,只能将其它数字类型转换成 int 类型,它不能转换字符串,比如下例就会失败:

    string v = "1";
    int n = (int)v;

    ----------------------------------------------------------------------------------------------------------------

    一些可能引发性能问题:

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


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

  • 相关阅读:
    一个字段串拆分成多行显示或者多行数据合并成一个字符串
    sql server 创建登录名,并赋予访问权限
    调用CMD 执行命令
    安装 mysql
    数组和List以指定的方式拼接成字符串类型
    专业术语
    服务器读取客户端文件
    Docker基本操作
    Docker在Centos上的安装
    SpringBoot一览
  • 原文地址:https://www.cnblogs.com/mumue/p/2549876.html
Copyright © 2020-2023  润新知