【问题标题】:How is String.Substring more efficient than String.Split?String.Substring 如何比 String.Split 更高效?
【发布时间】:2020-11-14 01:07:52
【问题描述】:

Joe Duffy's Blog 意味着使用string.Substringstring.Split 更有效。

我不知道它是否说 Substring 方法没有分配新字符串,或者它是否更有效,因为它不会进行任何不需要的分配。你能解释一下它是如何更有效的并举个例子吗?

我理解他的第一个例子是创建一个数组,然后处理数组中的每个字符串。

string str = ...;
string[] substrs = str.Split(',');
foreach (string subtr in substrs) {
Process(substr);
}

以下如何更高效

string str = ...;
int lastIndex = 0;
int commaIndex;
while ((commaIndex = str.IndexOf(',', commaIndex)) != -1) {
    Process(substr, lastIndex, commaIndex);
    lastIndex = commaIndex + 1;

我看到的是使用String.IndexOf 查找逗号的索引,然后处理字符串。我假设他打算在处理过程中使用String.Substring 来提取数据。下面的一位 cmets 建议他可能会逐个字符地拉它。他会一直拉字符,直到他击中下一个逗号,可能会构建一个字符数组?

【问题讨论】:

  • 是的 sting.Index of 用于查找逗号的索引,但在您假设的处理方法中,您仍然需要创建一个子字符串来提取这些索引中的数据。对吗?
  • 我的立场是正确的 - 这个例子确实令人困惑
  • “那里潜伏着地雷 API,比如 String.Split 和 String.Substring”暗示他认为 Substring 效率不高。而且我认为“String毕竟有一个索引器。而且它是类型安全的!所以就地解析至少不会导致缓冲区溢出”意味着他打算让你逐个字符地访问子字符串,而不是使用Substring
  • @GrimR3:您不需要创建子字符串来访问数据,但如果您不这样做,您想要做的一切都会变得更加复杂。您将无法再访问最初使字符串有用的大部分内容,例如Trim*StartsWithEndsWith,以及一般的直接比较。 (例如,substr == "stuff" 变为 (end - start) == 5 && String.Compare(str, start, "stuff", 0, 5) == 0。)您必须自己完成所有这些操作,而且您可能会在此过程中搞砸很多。请注意,作者自己的示例无法编译。 :P
  • @Blorgbeard:Substring 没有达到应有的效率。我看到的代码似乎表明它总是创建一个包含字符副本的新数组,而不是像 Java 那样使用范围引用原始字符串的数组。 Java 方式的缺点是 longString.substring(0, 2) 可以将 longString 的整个后备数组保留在内存中,即使在 longString 死后您只使用它的两个字符。

标签: c# .net


【解决方案1】:

祝你好运。

老笑话:经理想知道程序员 A 还是程序员 B 是更好的程序员,所以他举办了一场比赛。他们都将编写一个程序来解决给定的复杂问题,编写最好的程序的人将获胜。

两位程序员提交了他们的答案。程序员 A 的程序跑得最快,经理正要宣布他是赢家时,程序员 B 指出程序员 A 的程序给出的答案有点不对劲。

“但我的程序仍然是最快的,我应该赢”,程序员 A 说。

“如果答案不必是正确的,我可以写一个比你快 10 倍的程序”,程序员 B 反驳道。

Joe Duffy 的第二个示例是错误的,他避免使用 string.Split()。它不会编译。变量“substr”未定义。

我休息一下。

【讨论】:

  • 开个玩笑,但我不确定你的意思是什么。 Joe Duffy 的错误是一个简单的错字——他的意思是说“str”而不是“substr”。
  • @Blorgbeard:尽管如此,他不小心破坏了代码有点让人明白这一点。事情越复杂,就越有可能出现类似的情况。尤其是在您增加复杂性的情况下。对他的案子没有帮助,这也只是一个错字;有证据表明,在他开始对子字符串进行咆哮之前,他没有费心测试或分析代码。实际上在 VS 中输入它并编译它会发现错误。
  • @Blorgbeard:cHao 说的——当我看到第二个例子的错误时,我什至懒得看这篇文章,这个笑话突然出现在我的脑海里。如果答案是错误的,那么程序是快 10 倍还是快 1000 倍都没有关系。如果程序不必要地复杂,那么它就更有可能出错,无论是现在还是由于维护需要更改它时。
  • @cHao:我看到你对 Joe Duffy 的博客文章发表了评论。奇怪的是,那里的第一条评论是七个月前发布的,指出了错误,而 Duffy 先生没有费心更正他的代码或回复。
  • @RenniePet 好的,答案是错误的,但可以轻松纠正。假装他纠正了错字。答案将不再是错误的。你对他的帖子还有其他异议吗?我并不是真的在这里为乔·达菲辩护,我只是认为存在一个错字是一件奇怪的事情,你可以以此为依据驳回他的想法。..
猜你喜欢
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2014-10-06
  • 2016-01-12
  • 1970-01-01
  • 2015-06-06
相关资源
最近更新 更多