Максимально быстрое определение количество вхождений подстроки в строку - C#
Формулировка задачи:
Добрый день!
Необходимо максимально быстро подсчитывать количество пробелов в строке. Написал такой код:
У меня получается: 27 пробелов, 1150 миллисекунд. Процессор i7-3610QM.
Что-то все равно медленно, возможно ли ускорить?
То есть из строки удаляются пробелы, измеряется ее длина, а потом считается разница между длинами.
Получается: 148 миллисекунд. Но на больших объемах все равно медленно. Можно ли еще быстрее сделать?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); System.Diagnostics.Stopwatch swatch = new System.Diagnostics.Stopwatch(); swatch.Start(); string line = "Проблемы можно решать по-разному. Можно просто напиться в дым, и они на время исчезнут. Но я предпочитаю разбираться с ними до того, как они начнут разбираться со мной."; string symbol = " "; int count = -1; //для теста делаем 100 тыс. итераций for (int i = 1; i < 100000; i++) { int a = 0; int x = -1; count = -1; while (a != -1) { a = line.IndexOf(symbol, x + 1); x = a; count++; } } swatch.Stop(); MessageBox.Show("Количество символов - " + count.ToString() + "\r\nВремя - " + swatch.ElapsedMilliseconds.ToString()); } } }
О, написал еще такой вариант:
for (int i = 1; i < 100000; i++) { string modified = line.Replace(" ", ""); count = line.Length - modified.Length; }
Решение задачи: «Максимально быстрое определение количество вхождений подстроки в строку»
textual
Листинг программы
using System; using System.Threading.Tasks; namespace ConsoleApplication42 { class Program { static void Main(string[] args) { System.Diagnostics.Stopwatch swatch = new System.Diagnostics.Stopwatch(); swatch.Start(); var line = "Проблемы можно решать по-разному. Можно просто напиться в дым, и они на время исчезнут. Но я предпочитаю разбираться с ними до того, как они начнут разбираться со мной."; var count = 0; Parallel.ForEach(line, symbol => { if (symbol.Equals(' ')) count++; }); swatch.Stop(); Console.WriteLine("Количество символов - " + count.ToString() + "\r\nВремя - " + swatch.ElapsedMilliseconds.ToString()); Console.ReadKey(true); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д