使用String.Substrings,是否缺乏性能?

时间:2011-11-25 17:33:05

标签: c# performance

我正在尝试解析一个大文本字符串。我需要将原始字符串拆分为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();
}

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

4 个答案:

答案 0 :(得分:3)

你会得到稍微好一点的表现(但是性能的提升是否会很重要,这完全是另一回事):

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;
}

答案 1 :(得分:1)

我认为你对不可改变的问题是正确的 - 每次重建'原创'可能不是最快的方法。

如何将'原创'传递到StringReader课程?

答案 2 :(得分:1)

如果您的original字符串超过几千个字符,那么您将有明显的(> 0.1秒)处理时间和大量的GC压力。第一个Substring电话很好,除非你深入System.String并且与m_FirstChar混在一起,否则我认为你不能避免它。在使用char-by-char并迭代Substring时,可以完全避免第二个int

答案 3 :(得分:0)

一般情况下,如果您在较大的数据上运行此类代码可能会出现问题,那么它当然取决于您的需求。

一般情况下,使用StringBuilder类可能是一个好主意,这将允许您以“更可变”的方式操作字符串而不会影响性能,例如从中移除而不重新分配整个字符串。< / p>

在你的例子中,我会考虑抛出从原始子字符串中取出的字符串,并用一些代码替换它,这些代码会更新指向应该从哪里获取新子字符串的索引。然后,条件只是检查你的索引是否在字符串的末尾和你的临时方法将不是从0到14的子串而是从i,我将是这个索引。

但是 - 如果你不需要,不要优化代码,我假设你需要更多的性能,并且你想牺牲一些时间和/或编写一些不易理解的代码以提高效率。