powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / массовый поиск подстрок в строке
25 сообщений из 118, страница 2 из 5
массовый поиск подстрок в строке
    #39949537
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

ахо-корасик - это комбинация однопроходного пратта с поиском по словарю
Критично время поиска по словарю, если пренебречь временем его построения.

Исходный алгоритм работал на trie (сначала переводили как бор, теперь вроде луч прижился) - старая структура 1959 года рождения.

В её исходном виде преимущество состоит в совмещении общего префикса в шаблонах поиска -
при наличии общего префикса в отыскиваемых строках,
поиск автоматически идет по всему подмножеству элементов словаря с таким общим префиксом.
Недостаток - расточительность по памяти на "современных" строках.
В какой-то момент структура умерла из-за требований по памяти на расширившемся общем строковом алфавите.

При неудачных реализациях может проигрывать по скорости другим вариантам организации словаря.

Было несколько попыток вдохнуть вторую жизнь в эту структуру.
Как просто модернизацией конструкции - типа перехода к троичному дереву, так и совмещением с идеями поразрядной сортировки.
Почитай у Седжвика - он много времени этому вопросу сам посвятил.

Ахо-Корасик не обязан выигрывать просто потому, что есть словарь
К нему мозг в конкретной ситуации рекомендуется прикладывать...

Его пригодность к работе на потоке данных без возврата к предыдущим символам потока - это как раз то,
что в определенных ситуациях важнее всего остального.
Потому и прикладывают...
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949539
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
love_bach
пропущено...


это вообще возможно впринципе?


Вы сами ахо карасика смотрели? Он за один проход работает. Построение дерева делается от исходных слов до начала прохода.


я уже могу путаться, но Кнут-Моррис-Прат - точно за два
если ишешь именно алгоритм, то тебе дорога в суффиксные деревья
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949546
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Сколько по вашему должен работать оптимальный алгоритм, тот же самый ахо-карасик? По мне так за 10 сек, если все в памяти и должен выдать массив со счетчиком вхождений.


Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает.

У вас 35 миллионов сравнений.
Разделим на 10 секунд, которые вы хотите.
Значит в секунду должно отрабатывать 3.5 млн сравнений.
Но это без учёта длины строк.
Мы не знаем что вы там и с чём сравниваете.

Скорость вычисления вхождения строки из 10 символов в строке 100 символов будет отличаться от строки из 100 символов в строке 10000 символов.

Мы не знаем что у вас там за исходные данные.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949569
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
a_voronin
Сколько по вашему должен работать оптимальный алгоритм, тот же самый ахо-карасик? По мне так за 10 сек, если все в памяти и должен выдать массив со счетчиком вхождений.


Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает.

У вас 35 миллионов сравнений.
Разделим на 10 секунд, которые вы хотите.
Значит в секунду должно отрабатывать 3.5 млн сравнений.
Но это без учёта длины строк.
Мы не знаем что вы там и с чём сравниваете.

Скорость вычисления вхождения строки из 10 символов в строке 100 символов будет отличаться от строки из 100 символов в строке 10000 символов.

Мы не знаем что у вас там за исходные данные.


ну, он видимо про линейность сложности. а тут х..якс - вроде и линейно, но сильно высокая
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949580
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает


Какого алгоритма?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949586
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
hVostt
Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает


Какого алгоритма?


Ну в данном случае алгоритм -- простой перебор, строк, затем символов в строках.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949588
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
ну, он видимо про линейность сложности. а тут х..якс - вроде и линейно, но сильно высокая


Это примерно как в магазин ходить и спрашивать "а чёт так дорого-то?" :)

А сколько "не дорого"?

Т.е. почему мои N операций выполняются долго?
Почему это "долго"? По сравнению с чем?

Это ж странно. Непонятна какая задача. Достигнуть символического комфорта?

10 секунд долго, но 9 уже нормас?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949594
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach
пропущено...


Какого алгоритма?


Ну в данном случае алгоритм -- простой перебор, строк, затем символов в строках.


hVostt - это не перебор. ТС тоже это понимает
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно

Попробовал посчитать скорость: допустим в каждой из 65000 строк в среднем 1000 символов (с запасом), т.е. 65 млн. символов. Один поиск идет 18 минут / 600 = 1.8 сек. Отсюда скорость поиска 65 млн. символов / 1.8 сек = 36.1 млн. символов / сек.

При частоте проца 3,6 ГГц - 100 тактов на одно сравнение. Это как бы вообще тормоз.

ИМХО тут что-то важное не озвучено, то на что действительно тратится время. Тут надо искать
a_voronin
Код: c#
1.
        //Do something here

...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949769
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Как бы мы тут все гадаем, как же ускорить неизвестный код с неизвестными нам данными
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949770
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
hVostt - это не перебор. ТС тоже это понимает


Ну что там ещё? Вычисление интегралов? Экстраполирование? Расчёт пути в графе? )))
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949853
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
a_voronin
поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно

Попробовал посчитать скорость: допустим в каждой из 65000 строк в среднем 1000 символов (с запасом), т.е. 65 млн. символов. Один поиск идет 18 минут / 600 = 1.8 сек. Отсюда скорость поиска 65 млн. символов / 1.8 сек = 36.1 млн. символов / сек.

При частоте проца 3,6 ГГц - 100 тактов на одно сравнение. Это как бы вообще тормоз.

ИМХО тут что-то важное не озвучено, то на что действительно тратится время. Тут надо искать
a_voronin
Код: c#
1.
        //Do something here



Наиболее трудоемкое для процессора действия это вызов метода. CALL. Второе по трудоемкости -- это условный переход. А если вы пишете операции со строками, то вызовом метода там немало. Все свойства это методы.

Тут вопрос скорее всего не в алгоритме, а в том, чтобы найти оптимизированный, оптимально написанный код.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949856
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot hVostt#22120128]
a_voronin

Значит в секунду должно отрабатывать 3.5 млн сравнений.


За секунду может срабатывать 3 миллиарда x 8 = 24 сравнений символов. Не вижу причин, которым нельзя работать с такой скоростью.

Попробую может вечером как-нибудь в качестве спортивного интереса написать на unmanaged коде без вызова методов.

Код собственно говоря выглядит вот так.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
static object parallelLock = new object(); 
        internal void AddUsage(TraceRecord query)
        {
            int i = 0; 
            var MDX_upper = query.MDX.ToUpper(); -- строка 500-8000 символов. 
            if (true)
            {
                Parallel.ForEach(cubeElements, cubeElement =>
                {
                    if (FastIndexOf(MDX_upper, cubeElement.NameUpper) > 0) -- NameUpper строка 10-30 символов 
                    {
                        lock (parallelLock)
                        {
// обработка ....
                        }
                    }
                }
                );
            }
}

static int FastIndexOf(string source, string pattern) {
  if (pattern == null) throw new ArgumentNullException();
  if (pattern.Length == 0) return 0;
  if (pattern.Length == 1) return source.IndexOf(pattern[0]);
 bool found;
  int limit = source.Length - pattern.Length + 1;
  if (limit < 1) return -1;
 // Store the first 2 characters of "pattern"
  char c0 = pattern[0];
  char c1 = pattern[1];
 // Find the first occurrence of the first character
  int first = source.IndexOf(c0, 0, limit);
 while (first != -1) {
   // Check if the following character is the same like
    // the 2nd character of "pattern"
    if (source[first + 1] != c1) {
      first = source.IndexOf(c0, ++first, limit - first);
      continue;
    }
   // Check the rest of "pattern" (starting with the 3rd character)
    found = true;
    for (int j = 2; j < pattern.Length; j++)
      if (source[first + j] != pattern[j]) {
        found = false;
        break;
      }
   // If the whole word was found, return its index, otherwise try again
    if (found) return first;
    first = source.IndexOf(c0, ++first, limit - first);
  }
  return -1;
}



В среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо.

Если брекить дебаггер он как правило встает здесь.

first = source.IndexOf(c0, ++first, limit - first);

А вообще простая строка кода превращается в нагромождение непонятно чего. Вот на такие вызовы методов и тратятся такты.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
                if (source[first + 1] != c1)
00B59EF3  mov         edx,dword ptr [ebp-54h]  
00B59EF6  inc         edx  
00B59EF7  mov         ecx,dword ptr [ebp-3Ch]  
00B59EFA  cmp         dword ptr [ecx],ecx  
00B59EFC  call        67C33ED0  
00B59F01  mov         dword ptr [ebp-0A0h],eax  
00B59F07  mov         eax,dword ptr [ebp-0A0h]  
00B59F0D  cmp         eax,dword ptr [ebp-50h]  
00B59F10  setne       al  
00B59F13  movzx       eax,al  
00B59F16  mov         dword ptr [ebp-6Ch],eax  
00B59F19  cmp         dword ptr [ebp-6Ch],0  
00B59F1D  je          00B59F4F 
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949870
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Меня устроит полминуты. 800 строк по 10-30 символов, найти каждая входит или нет в 90000 строк от 200 до 8000 символов (в среднем 2000).

… должен выдать массив со счётчиком.


a_voronin
Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет.

Нужен быстрый массовый поиск, потому что поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно.


Если вы уверены что проблема в языке/оптимизации кода то я вам помочь не могу, но и мнение ваше не разделяю. Тот код что вы смотрите и тот что выполняется на процессоре уже может отличатся и CLR наверняка заменит source.IndexOf(c0, 0, limit); на низкоуровневый cmpsw.

А для оптимизации алгоритма нужно кое-что уточнить.
— В чем у вас проблема? Если набор поиска и набор строк текста постоянный то запишите сразу результату поиска. Я так предполагаю что у вас или набор строк поиска или набор строк текста или оба не постоянный. Проясните что.
— Текст на каком языке?
— что является источником меняемого набора (поиска или текста)?

a_voroninВ среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо.


— любое вхождение или первое?
— что нужно узнать: что вхождение есть, вхождение какой подстроки (давайте уже использовать подходящий лексикон — шаблон) или место вхождения?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949880
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Это анализ залогированных MDX запросов для сбора статистики об использовании показателей.

Показатели постоянны, запросы разные. C# по оптимизации кода явно уступает C++.

На C++ здесь вообще не было бы вызова метода.

if (source[first + 1] != c1) {

Код я смотрю в дебаге. По нему можно ходить дебаггером и смотреть регистры. Поэтому это явно реальный конечный код. Goto Dissasembly не заглядывали?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949881
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron


— любое вхождение или первое?
— что нужно узнать: что вхождение есть, вхождение какой подстроки (давайте уже использовать подходящий лексикон — шаблон) или место вхождения?


если вы посмотрите на начало поста, то там сформулирована задача

"Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет."

Факт наличия нескольких подстрок в строке. Даже не количество и не позиции.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949909
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

А код обработки учитываете? Вместе с довольно ресурсоёмким локом-монитором?

FastIndexOf содержит весьма сомнительные и нафиг не нужные оптимизации.

Почему не используете StringComparison.Ordinal?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949916
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Давайте сначала уточним определения. "Факт наличия нескольких подстрок в строке. "
"подстрока" - шаблон поиска.
"строка" или текст, в котом происходит поиск.

Таким образом у вас набор шаблонов поиска постоянный, или почти постоянный и меняется редко, верно?

Ваша проблема заключается в том что поиск в динамическом наборе строк выполнятся медленно, но сам набор строк динамичен и не известен заранее. т.е. его нельзя предварительно обработать. Верно?

Тепер ещё раз к постановке задачи:

автор"Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет."
В среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо.
Факт наличия нескольких подстрок в строке. Даже не количество и не позиции.


Ваши условия противоречивы:
Если вам не интересуют какие конкретно шаблоны найдены и где они найдены то что есть "массив вхождений. 3 8 22 66 найдены."

"Если одно вхождение конкретной строки найдено, других искать не надо." Если 'то условие верно как понимать "Факт наличия нескольких подстрок в строке." вообше не может быть установлен так - как для 'того надо минимум совпадение двух шаблонов.

Уточните пожалуйста.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949956
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Ищем постоянный набор строк

["яблоки", "груши", "сливы", "ананасы"]

В строке поиска

"В саду созрели груши и сливы"
ответ ["груши", "сливы"] или [1,2] при нумерации от 0

"У нас не растут ананасы, выращивайте яблоки"
ответ ["яблоки", "ананасы"] или [0,3]
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39949970
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
mikron,

Ищем постоянный набор строк

["яблоки", "груши", "сливы", "ананасы"]

В строке поиска

"В саду созрели груши и сливы"
ответ ["груши", "сливы"] или [1,2] при нумерации от 0

"У нас не растут ананасы, выращивайте яблоки"
ответ ["яблоки", "ананасы"] или [0,3]


Вы совсем запутали меня. Значит нас интересуют какие шаблоны найдены?

Нам нужно знать все шаблоны,
или только первый,
или любой,
или только что минимум два,
или что минимум два разных,
или вообще что хоть один?

Я не из дотошности спрашиваю, просто это разные задачи и для них разные методы.

Ищем постоянный набор строк
["яблоки", "груши", "сливы", "ивы", "ананасы"]

В строке поиска
"В саду росли яблоки и сливы"

Ответ "шаблон найден" верный?
Ответ ["яблоки"] верный?
Ответ ["ивы"] верный?
Ответ ["яблоки", "ивы"] верный?
Ответ ["ивы", "яблоки"] верный?
Ответ ["ивы", "сливы"] верный?
Ответ ["яблоки", "сливы", "ивы"] верный?

В строке поиска
"В саду росли сливы"

Ответ "шаблон найден" верный?
Ответ ["ивы"] верный?
Ответ ["ивы", "сливы"] верный?
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39950000
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Ищем постоянный набор строк
["яблоки", "груши", "сливы", "ивы", "ананасы"]

В строке поиска
"В саду росли яблоки и сливы"

Ответ ["яблоки", "сливы", "ивы"] верный.

Но в моей реальной задаче не будет "сливы", "ивы" все строки уникальны и ни одна не является подстрокой другой.

то есть ответ Ответ ["яблоки", "сливы"] тоже устроит.

Хотя, я так понимаю может быть нюанс в реализации.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39950005
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron
a_voronin
mikron,

Ищем постоянный набор строк

["яблоки", "груши", "сливы", "ананасы"]

В строке поиска

"В саду созрели груши и сливы"
ответ ["груши", "сливы"] или [1,2] при нумерации от 0

"У нас не растут ананасы, выращивайте яблоки"
ответ ["яблоки", "ананасы"] или [0,3]


Вы совсем запутали меня. Значит нас интересуют какие шаблоны найдены?

Нам нужно знать все шаблоны,
или только первый,
или любой,
или только что минимум два,
или что минимум два разных,
или вообще что хоть один?

Я не из дотошности спрашиваю, просто это разные задачи и для них разные методы .

Ищем постоянный набор строк
["яблоки", "груши", "сливы", "ивы", "ананасы"]

В строке поиска
"В саду росли яблоки и сливы"

Ответ "шаблон найден" верный?
Ответ ["яблоки"] верный?
Ответ ["ивы"] верный?
Ответ ["яблоки", "ивы"] верный?
Ответ ["ивы", "яблоки"] верный?
Ответ ["ивы", "сливы"] верный?
Ответ ["яблоки", "сливы", "ивы"] верный?

В строке поиска
"В саду росли сливы"

Ответ "шаблон найден" верный?
Ответ ["ивы"] верный?
Ответ ["ивы", "сливы"] верный?


приведи хотя бы один
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39950070
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
mikron,

Ищем постоянный набор строк
["яблоки", "груши", "сливы", "ивы", "ананасы"]

В строке поиска
"В саду росли яблоки и сливы"

Ответ ["яблоки", "сливы", "ивы"] верный.
то есть ответ Ответ ["яблоки", "сливы"] тоже устроит.


1.Вариант: вариация Карп-Рабин. (условие - мин. длина шаблона 8 символов)
1.0. Подготовка к поиску
1.1. Представте шаблоны в масивы байт.
1.2. Пострийте хештаблицу на ваши шаблоны. Именно таблицу на массивах без классов блиблиотеки.
особенно важно как строить. для каждого шаблона каждые 4 байта и есть хеш. т.е. 0..3, 1..4, 2..5, 3..6, 4..7, ....
Сама таблица [номер шаблона << 4 + смешение начала ]
1.3. Поиск
1.4. Перевидите строку в байты. Сравнивайте с хештаблицей. Если поподание есть то проверит полное соответсвие.
Сравниваите толко с 4-х кратнзч позиций. 0..3, 4..7, 8..11, ...

2. Вариант: если шаблоны короткие но длинее 3 символов. Идея как вариант1, но хеш фукция должна быстро строится и подстариватся. Я уже не помню как такой класс хеш функций называется но XOR как раз о ней.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39950103
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Если у вас данные секрета не представляют, выложите тут, потренируемся на них.
...
Рейтинг: 0 / 0
массовый поиск подстрок в строке
    #39950111
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

Вот тестовые данные -- попробуйте перебить обычный цикл с Contains?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] strs = new string[] {
                "AAC00", "1248A", "1258A", "1348A", "D248A", "1D48A", "12D8A", "1248D",
                "A0C", "1048A", "0258A", "0348A", "D208A", "1D08A", "10D8A", "1240D",
                "A7C", "1247A", "1257A", "13487", "D247A", "1D47A", "17D8A", "1278D",
            };

            int MAX = 10000;
            int MAX2 = 1000;
            var texts = Enumerable.Range(1, MAX).Select(
                g => string.Join("", Enumerable.Range(1, MAX2).Select(
                    gg => Guid.NewGuid().ToString().ToUpper()).ToArray())
                ).ToList();

            Int64[] found = new Int64[strs.Length];
            InitFound(strs, found);
            var sw0 = new Stopwatch();
            sw0.Start();
            Parallel.ForEach(texts, text =>
            {
                for (int i = 0; i < strs.Length; i++)
                    if (text.Contains(strs[i]))
                        found[i]++;
            });
            sw0.Stop();
            Debug.WriteLine(string.Join(",", found.Select(x => x).ToArray()));

            InitFound(strs, found);
            var sw1 = new Stopwatch();
            sw1.Start();
            Parallel.ForEach(texts, text =>
            {
                for (int i = 0; i < strs.Length; i++)
                    if (text.Contains(strs[i]))
                        found[i]++;
            });
            sw1.Stop();
            Debug.WriteLine(string.Join(",", found.Select(x => x).ToArray()));


            Console.WriteLine($"time0 = {sw0.ElapsedMilliseconds} time1 = {sw1.ElapsedMilliseconds}");
            Console.ReadKey();
        }

        private static void InitFound(string[] strs, long[] found)
        {
            for (int i = 0; i < strs.Length; i++)
                found[i] = 0;
        }

    }
}
...
Рейтинг: 0 / 0
25 сообщений из 118, страница 2 из 5
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / массовый поиск подстрок в строке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]