Убрать лишние пробелы из строки с максимальной скоростью - C#
Формулировка задачи:
Имеем строку:
Нужно максимально быстро убрать пробелы в начале и конце строки, а внутри оставить только по одному пробелу между словами.
Я попробовал два варианта: с помощью регулярного выражения и с помощью посимвольного перебора строки и склейки в StringBuilder. В первом случае время 6,5 секунд (на 5 млн. строк), во втором случае время 3,6 секунд (на 5 млн. строк).
Как думаете, можно ли еще быстрее сделать эту операцию?
Код теста приложен:
string line = " Мама мыла раму ";
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace test { public partial class Form1 : Form { public Form1() { InitializeComponent(); Regex reSpaces = new Regex(" {2,}", RegexOptions.Compiled); DateTime start = DateTime.Now; string line = " Мама мыла раму "; string result = null; for (int i = 0; i < 5000000; i++) { //1. С помошью регулярного выражения + Trim = 6,5 секунд //result = reSpaces.Replace(line, " "); //result = result.TrimEnd().TrimStart(); //2. С помощью разделение строки и обратной склейки = 3,6 секунд result = CompactWhitespaces(line); } DateTime end = DateTime.Now; MessageBox.Show(result); MessageBox.Show((end - start).TotalSeconds.ToString()); } public static String CompactWhitespaces(String s) { StringBuilder sb = new StringBuilder(s); CompactWhitespaces(sb); return sb.ToString(); } public static void CompactWhitespaces(StringBuilder sb) { if (sb.Length == 0) return; int start = 0; while (start < sb.Length) { if (Char.IsWhiteSpace(sb[start])) start++; else break; } if (start == sb.Length) { sb.Length = 0; return; } int end = sb.Length - 1; while (end >= 0) { if (Char.IsWhiteSpace(sb[end])) end--; else break; } int dest = 0; bool previousIsWhitespace = false; for (int i = start; i <= end; i++) { if (Char.IsWhiteSpace(sb[i])) { if (!previousIsWhitespace) { previousIsWhitespace = true; sb[dest] = ' '; dest++; } } else { previousIsWhitespace = false; sb[dest] = sb[i]; dest++; } } sb.Length = dest; } } }
Решение задачи: «Убрать лишние пробелы из строки с максимальной скоростью»
textual
Листинг программы
FUNC = Suppir RESULT = 00:00:02.7561602 FUNC = cws RESULT = 00:00:00.6289758 FUNC = Psylon RESULT = 00:00:00.7196369 FUNC = FastCompactWhitespaces RESULT = 00:00:00.7681129
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д