使用字符串.子字符串,是否存在性能不足
本文关键字:字符串 性能 存在 是否 | 更新日期: 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就是这个索引。
然而,如果你没有必要,不要优化代码,我假设这里你需要更多的性能,你想牺牲一些时间和/或写一些不太容易理解的代码来提高效率。