【发布时间】:2019-05-05 06:26:31
【问题描述】:
我的 C# 应用程序中有这个功能:
public static string SafeTrim(object str)
{
if ( str == null || str == DBNull.Value )
return string.Empty;
else
return str.ToString().Trim();
}
它工作正常,但在我的导入实用程序中,它在处理数十万条记录时被调用了数百万次。 ANTS profiler 指出这个函数会消耗大量的 CPU 周期,因为它被频繁调用。
编辑:我没有提到
SafeTrim()的一个非常常见的用法 我的应用程序适用于DataRow/DataColumn值。例子:SafeTrim(dt.Rows[0]["id"])- 通常包含一个DBNull.Value,包含边缘空间也很常见 需要修剪。
可以以任何方式进行优化吗?
编辑:我将在负载下尝试这些不同的方法,并且 明天回来汇报。谢谢大家!
【问题讨论】:
-
如果要修剪字符串值,为什么要带参数
object?这是如何调用的以及传递给它的内容? -
我会先问自己是否真的需要如此频繁地调用此方法。也许(也许)您可以通过以类型感知的方式处理记录字段来消除对该方法的大量调用(例如,对于包含数字的记录字段,您不需要调用此方法)
-
DBNull.Value 似乎是从 IDataReader 获取的;有趣的是,您可以从 IDataReader 的第一条记录中获取 IsDbNull/GetFieldType - 然后以惊人的速度继续前进。如果速度是一个问题,不要在那里偷懒。
-
您可以应用 [MethodImpl(MethodImplOptions.AggressiveInlining)] 属性。适用于 x64 但不适用于 x86。这将阻止分析器抱怨它,因为它不再能看到该方法。然而,您的程序是否实际上更快是非常值得怀疑的。不仅仅是因为内联它可以让它变慢,这个程序的执行时间应该完全由 I/O 控制。检索数据的成本,分析器通常不会显示。将代码速度提高一倍并不会使 I/O 速度提高一倍,如果您看到了几个百分比的改进,那您就很幸运了。
标签: c#