c# – 最快的方式来替换一个巨大的字符串中的多个字符串

我寻找最快的方法来替换一个大(〜1mb)字符串的多个(〜500)子串。无论我尝试了,似乎String.Replace是最快的方法。

我只是关心最快的方式。不是代码可读性,可维护性等。我不在乎,如果我需要使用不安全的代码或预处理原始的字符串。

编辑:评论后,我添加了一些更多的细节:

每个替换迭代将替换一些其他字符串(不同的每个替换迭代)的字符串上的ABC。要替换的字符串将始终如一 – ABC将始终为ABC。从不ABD。所以如果有400.000万代替迭​​代。相同的字符串 – ABC – 将被每个其他(不同的)字符串替换。

我可以控制什么是ABC。只要不影响结果,我可以使其超短或超长。显然,ABC不能是你好,因为你会在大多数输入字符串中作为一个单词存在。

示例输入:ABCDABCABCDABCABCDABCABCDABCD

字符串替换示例:BC

示例替换字符串:AA,BB,CC,DD,EE(5次迭代)

示例输出:

AAADAAAAAADAAAAAADAAAAAADAAAD
ABBDABBABBDABBABBDABBABBDABBD
ACCDACCACCDACCACCDACCACCDACCD
ADDDADDADDDADDADDDADDADDDADDD
AEEDAEEAEEDAEEAEEDAEEAEEDAEED

平均情况:输入字符串为100-200kb,40.000代替迭代。
最差情况:输入字符串为1-2mb,400.000代替迭代。

我什么事都能做。并行进行,做到不安全,等等。不管我怎么做。重要的是它需要尽可能快。

谢谢

最佳答案
由于我对这个问题感兴趣,所以我制定了几个解决方案。通过硬核优化,可以进一步下降。

得到最新的来源:https://github.com/ChrisEelmaa/StackOverflow/blob/master/FastReplacer.cs

并输出

-------------------------------------------------------
| Implementation       | Average | Separate runs      |
|----------------------+---------+--------------------|
| Simple               |    3485 | 9002, 4497, 443, 0 |
| SimpleParallel       |    1298 | 3440, 1606, 146, 0 |
| ParallelSubstring    |     470 | 1259, 558, 64, 0   |
| Fredou unsafe        |     356 | 953, 431, 41, 0    |
| Unsafe+unmanaged_mem |      92 | 229, 114, 18, 8    |
-------------------------------------------------------

你不会在制定自己的替代方法时击败.NET的人,它很可能已经在使用不安全。我确实相信如果你把它完全写在C中,你可以把它归因于两个。

我的实现可能是错误的,但你可以得到一般的想法。

转载注明原文:c# – 最快的方式来替换一个巨大的字符串中的多个字符串 - 代码日志