获取字符串第一个字符的快速方法

本文关键字:方法 字符 字符串 第一个 获取 | 更新日期: 2023-09-27 18:33:42

在我的类库中,将检查许多字符串的第一个字符,无论它们是否与特定字符匹配。我通过索引访问第一个字符来做到这一点:

var isMatch = stringToCheck[0] == SPECIAL_CHARACTER;

有没有更快的方法来执行此检查?

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

获取字符串第一个字符的快速方法

No.据我所知,没有。

最快的方法是string类持有m_firstChar,但不幸的是,这被宣布为private

this访问器是最快的方法。它直接指向 CLR 上的非托管实现,因此很难更快地获得它。

如果你愿意使用不安全的操作,你可以获取一个指向字符串的指针,并以这种方式获取第一个字符。(需要在生成设置中启用不安全的代码,并标记方法或类unsafe才能正常工作。

char cChr;
fixed ( char* pStr = sString )
{
    cChr = *pStr;
}
var isMatch = ( cChr == SPECIAL_CHARACTER );

在内部,这被编译为调用System.Runtime.CompilerServices.RuntimeHelpers.get_OffsetToStringData - 这可能比索引器访问略快,但会打开其他潜在问题(与使用不安全代码相关 - 在我的工作中,有政策禁止出于任何原因使用不安全的代码)。

但是,即使这样,您也不太可能看到显着的性能提升:此代码非常简单,以至于库中的几乎所有其他内容都应该隐藏它。我很难相信你在问题中的一句话会占用你 40% 的执行时间。

在 .Net Core 3+/.Net 5+ 上,可以使用 string.GetPinnableReference() 访问字符串的第一个字符,而无需范围检查。对于空字符串,该字符将''0'

请注意,此方法不会显示在智能感知中,因为它标记为 [EditorBrowsable(Never)]