性能字符串检查

时间:2018-12-03 22:00:10

标签: c#

我的C#应用​​程序中具有此功能:

public static string SafeTrim(object str) 
{
    if ( str == null || str == DBNull.Value )
      return string.Empty;
    else
      return str.ToString().Trim();
}

它可以正常工作,但是在我的导入实用程序中,它被称为百万次,同时处理了数十万条记录。 ANTS探查器指出,此函数调用频率很高,因此会占用大量CPU周期。

  

编辑:我忽略了SafeTrim()在   我的应用程序适用于DataRow/DataColumn个值。例:   SafeTrim(dt.Rows[0]["id"])-通常包含一个   DBNull.Value,并且通常包含边缘空间   需要修剪的东西。

可以以任何方式对其进行优化吗?

  

编辑:在负载下,我将尝试这些不同的方法,并且   明天再报告。谢谢大家!

3 个答案:

答案 0 :(得分:1)

在我看来,几个简单的重载可能会有用:

public static string SafeTrim(object str)
{
    return str is string x ? SafeTrim(x) : String.Empty;
}

public static string SafeTrim(string str)
{
    return str?.Trim() ?? string.Empty;
}

我不明白如果object str是其他类型的话,返回值应该是什么,所以我没有把它放进去。


这是我的测试代码:

void Main()
{
    var rnd = new Random();
    var strings = Enumerable.Range(0, 1000000).Select(x => x.ToString() + (rnd.Next(2) == 0 ? " " : "")).ToArray();

    var results = new [] { new { source = 0, elapsed = TimeSpan.Zero } }.Take(0).ToList();

    for (int i = 0; i < 100; i++)
    {

        var sw = Stopwatch.StartNew();
        var trimmed0 = strings.Select(x => SafeTrim0(x)).ToArray();
        sw.Stop();
        results.Add(new { source = 0, elapsed = sw.Elapsed });

        sw = Stopwatch.StartNew();
        var trimmed1 = strings.Select(x => SafeTrim1(x)).ToArray();
        sw.Stop();
        results.Add(new { source = 1, elapsed = sw.Elapsed });      
    }

    results.GroupBy(x => x.source, x => x.elapsed.TotalMilliseconds).Select(x => new { x.Key, Average = x.Average() }).Dump();
}

public static string SafeTrim1(string str)
{
    return str?.Trim() ?? string.Empty;
}

public static string SafeTrim0(object str) 
{
    if ( str == null || str == DBNull.Value )
      return string.Empty;
    else
      return str.ToString().Trim();
}

SafeTrim0SafeTrim1之间,平均运行时间分别为155.8 ms和147.7 ms。

答案 1 :(得分:0)

Possible solution
public static string SafeTrim(object str)
{
     string result = (str as string)?.Trim() ?? null;
     if (result == null)
           return string.Empty;
     return result;
}

答案 2 :(得分:0)

使用ReferenceEquals可以减少运算符重载带来的一些嵌套函数调用。

public static string SafeTrim(object str) 
{
    if(ReferenceEquals(str, null) || 
       ReferenceEquals(str, DBNull.Value)) //DbNull.Value is singleton
    { 
        return string.Empty;
    }

    return str.ToString().Trim();
}
相关问题