Убрать лишние пробелы из строки с максимальной скоростью - 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