我的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
,并且通常包含边缘空间 需要修剪的东西。
可以以任何方式对其进行优化吗?
编辑:在负载下,我将尝试这些不同的方法,并且 明天再报告。谢谢大家!
答案 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();
}
在SafeTrim0
和SafeTrim1
之间,平均运行时间分别为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();
}