在我的类库中,很多字符串将检查其第一个字符是否与特定字符匹配。我这样做是通过索引访问第一个字符:
var isMatch = stringToCheck[0] == SPECIAL_CHARACTER;
有更快的方法进行此检查吗?
背景 我的类库提供了一个基于字符串的接口。它们将转换为内部数据结构,需要进行上述检查。不幸的是,很多数据都是通过接口进行的。我描述了我的测试套件,导致超过40%的总时间花在单线上。
答案 0 :(得分:3)
没有。我无法说清楚。
最快的方式是string
类保持m_firstChar
,但遗憾的是private
。
this
访问者是最快的方式。它在CLR上points directly to the unmanaged implementation,因此很难让它更快。
答案 1 :(得分:0)
如果您愿意使用不安全的操作,您可以获取指向该字符串的指针并获取该方式的第一个字符。 (您需要在构建设置中启用不安全的代码,并标记方法或类unsafe
以使其生效。)
char cChr;
fixed ( char* pStr = sString )
{
cChr = *pStr;
}
var isMatch = ( cChr == SPECIAL_CHARACTER );
在内部,这会被编译为调用System.Runtime.CompilerServices.RuntimeHelpers.get_OffsetToStringData
- 这个可能比索引器访问稍快,但会打开其他潜在问题(与使用不安全的代码相关 - 在我的工作中,有政策反对因任何原因使用不安全的代码。)
尽管如此,你不太可能看到显着的性能提升:这段代码非常简单,几乎你的库中的任何其他内容都应该隐藏它。我很难相信你问题中的单行代码占用了40%的执行时间。