【问题标题】:Faster string comparison in C#C#中更快的字符串比较
【发布时间】:2012-03-23 21:55:35
【问题描述】:

我有一个比较两个文件的程序。我跑了视觉工作室分析,发现我的比较时间很大。有没有比这更快的方法来比较两个字符串? (我不能使用并行 foreach,因为它可能会导致错误。)现在我正在使用并发字典,但我对其他选项持开放态度。 :)

var metapath = new ConcurrentDictionary<string, string>();
foreach(var me in metapath)
{
 if (line.StartsWith(me.Key.ToString()))
 {...}
}

【问题讨论】:

  • 比较时间有多大,有说明吗?
  • 您需要基于行的方法吗?从你的问题中并不完全清楚。您只想比较整个文件的相等性,还是单个文本文件的行?
  • @BoltClock well me.key.tostring 有 8 个字符长,行介于 200-1000 之间,所有比较大约需要 42 秒
  • @romkyns 是的,我认为它需要基于行
  • 听起来类似于这个问题:stackoverflow.com/q/8867710/409259

标签: c# string performance


【解决方案1】:

首先,从me.Key.ToString() 中删除ToString()

接下来,使用序号字符串比较(前提是这不影响正确性):

line.StartsWith(me.Key, StringComparison.Ordinal);

这是有益的,因为标准字符串比较遵循各种 Unicode 规则来判断什么是相等的。例如,规范化和非规范化序列必须同等对待。 Ordinal 只是比较原始字符数据,忽略 Unicode 相等规则。例如,herehere(声称它更快但没有引用任何数字)有更多详细信息。

最后,分析代码。你会感到惊讶,但大多数时候,缓慢的部分根本不是你想象的那样。例如,它可能是您在字典中添加内容的部分。

【讨论】:

  • 您能解释一下为什么这样做会有好处吗?
【解决方案2】:

如果你精确地比较字符串,String.Equals 是相当不错的:

String.Equals(line, me.Key)

你看到了吗:What is the fastest (built-in) comparison for string-types in C#

【讨论】:

  • 对不起,我不只是比较前 8 个字符
【解决方案3】:

不清楚你所说的“比较”到底是什么意思,但如果你不是指“排序”,即你想检查抄袭之类的,那么先对行进行散列并比较散列呢?

这将取决于您的数据集的大小是否有任何好处。大小是非常主观的术语。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2019-03-06
    • 2013-02-12
    • 1970-01-01
    • 2022-03-30
    • 1970-01-01
    相关资源
    最近更新 更多