快速获取字符串的第一个字符?

时间:2014-12-09 21:58:08

标签: c# string

在我的类库中,很多字符串将检查其第一个字符是否与特定字符匹配。我这样做是通过索引访问第一个字符:

var isMatch = stringToCheck[0] == SPECIAL_CHARACTER;

有更快的方法进行此检查吗?

背景 我的类库提供了一个基于字符串的接口。它们将转换为内部数据结构,需要进行上述检查。不幸的是,很多数据都是通过接口进行的。我描述了我的测试套件,导致超过40%的总时间花在单线上。

2 个答案:

答案 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%的执行时间。