使用字符串.子字符串,是否存在性能不足

本文关键字:字符串 性能 存在 是否 | 更新日期: 2023-09-27 18:15:50

我试图解析一个大的文本字符串。我需要将原始字符串分成15个字符的块(下一个块可能包含空格,因此使用trim函数)。我使用两个字符串,原始字符串和临时字符串。这个临时字符串用于存储每个长度为15的块。我想知道我是否会陷入性能问题,因为字符串是不可变的。这是代码:

string original = "THIS IS SUPPOSE TO BE A LONG STRING AN I NEED TO SPLIT IT IN BLOCKS OF 15 CHARACTERS.SO";
string temp = string.Empty;
while (original.Length != 0)
{
   temp = original.Substring(0, 14).Trim();
   original = original.Substring(14, (original.Length -14)).Trim();
}

感谢您的反馈,以便找到实现此功能的最佳方法。

使用字符串.子字符串,是否存在性能不足

您将获得稍微更好的性能(但性能增益是否显著完全是另一回事):

for (var startIndex = 0; startIndex < original.Length; startIndex += 15)
{
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim();
}

这样做性能更好,因为您不会在每次循环迭代时复制原始字符串的最后15个字符。

编辑

要将索引推进到下一个非空白字符,可以这样做:

for (var startIndex = 0; startIndex < original.Length; )
{
    if (char.IsWhiteSpace(string, startIndex)
    {
        startIndex++;
        continue;
    }
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim();
    startIndex += 15;
}

关于不可变的问题,我认为你是对的-每次都重新创建'原始'可能不是最快的方法。

如何传递'original'到StringReader类?

如果您的original字符串长于几千个字符,您将有明显的(>0.1s)处理时间和大量的GC压力。第一个Substring调用是好的,我不认为你可以避免它,除非你深入System.String和混乱的m_FirstChar。其次,当逐字符遍历int时,可以完全避免Substring

一般来说,如果您要在更大的数据上运行此代码可能会有问题,这当然取决于您的需要。

一般来说,使用StringBuilder类可能是一个好主意,它将允许你以"更可变"的方式操作字符串,而不会影响性能,比如从它的开始删除而不重新分配整个字符串。

在你的例子中,然而,我会考虑扔掉石灰,从原始的子字符串,并用一些代码替换它,更新一些索引,指出你应该从哪里得到新的子字符串。然后while条件会检查你的索引是否在字符串的末尾你的temp方法会取子字符串不是从0到14,而是从i,这里i就是这个索引。

然而,如果你没有必要,不要优化代码,我假设这里你需要更多的性能,你想牺牲一些时间和/或写一些不太容易理解的代码来提高效率。