Skip to content

Commit 7be0b3a

Browse files
committed
stricter Markdown linting (smaller line length)
1 parent 8d1d2bc commit 7be0b3a

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

.config/.markdownlint.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ MD009:
1111

1212
# Line length
1313
MD013:
14-
line_length: 140
14+
line_length: 120
1515
tables: false

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ ij_yaml_spaces_within_brackets = true
3030
[*.md]
3131
indent_style = space
3232
indent_size = 4
33-
max_line_length = 140
33+
max_line_length = 120

solution-notes-letter.ru.md

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,40 @@
1010
А я ожидал, что результат уже должен быть лучше аналогов. Тем более, что у меня специализированный алгоритм,
1111
а у grep синтаксис иной и алгоритм по определению хуже должен быть.
1212

13-
Потом я заменил алгоритм матча строки с динамическим программированием и памятью O(P*N) на другой, более быстрый и с константной памятью.
14-
И... я стал медленнее grep всего в 2 раза. Почти успех :))) При этом по профайлеру релизному у меня 80+% проводилось именно в матче строк.
13+
Потом я заменил алгоритм матча строки с динамическим программированием и памятью O(P*N) на другой,
14+
более быстрый и с константной памятью. И... я стал медленнее grep всего в 2 раза. Почти успех :)))
15+
При этом по профайлеру релизному у меня 80+% проводилось именно в матче строк.
1516

1617
Не буду томить, сомневаюсь, что более эффективный алгоритм существует для этой задачи.
17-
Победить grep вышло лишь добавив несколько оптимизаций, которые просто ускоренно прокручивали алгоритм в популярных сценариях.
18-
Это ускорило матчинг примерно в 6 раз, а общее время работы программы раза в 3. И эта дало победу над grep всего лишь на 25-35%.
18+
Победить grep вышло лишь добавив несколько оптимизаций, которые просто ускоренно прокручивали
19+
алгоритм в популярных сценариях. Это ускорило матчинг примерно в 6 раз,
20+
а общее время работы программы раза в 3. И эта дало победу над grep всего лишь на 25-35%.
1921

2022
После этого согласно профайлеру почти ровно половина времени проводилась
2123
в матче строк, а процентов под 40 времени проводилось в синхронном ReadFile().
2224

2325
Я решил, что вот он звёздный час асинхронного чтения файлов!
2426
Запрограммировал, и... ничего. Общее время работы не изменилось.
25-
Но профайлер показал перераспределение времени в сторону алгоритма матча. Очень странно, что он замедлился. Я так и не понял почему так.
27+
Но профайлер показал перераспределение времени в сторону алгоритма матча.
28+
Очень странно, что он замедлился. Я так и не понял почему так.
2629
Я убеждён, что эти 40% можно было сжать до максимум 5% за счет параллелизации вычитки данных и их обработки.
27-
Возможно это как-то связано с тем, что данные лежат в файловом кэше, а не читаются с диска (более короткий путь IRP).
30+
Возможно это как-то связано с тем, что данные лежат в файловом кэше,
31+
а не читаются с диска (более короткий путь IRP).
2832
Возможно это банальное копирование памяти в kernel mode плохо параллелизуется.
2933
Может стоило переписать, чтобы чтение с диска в выделенном потоке выполнялось...
3034
Если у вас есть идеи почему так вышло или в чём ошибка, то буду рад если поделитесь.
3135

3236
Также заметил вставку перед циклом команды nop при оптимизации по скорости компилятором.
33-
Есть лишь предположения зачем. Если вы вдруг знаете - тоже дайте знать. Есть скриншот, приложил его в проект.
37+
Есть лишь предположения зачем. Если вы вдруг знаете - тоже дайте знать.
38+
Есть скриншот, приложил его в проект.
3439
Я спросил моих разных коллег, они не в курсе.
3540

3641
Попробовал на всякий случай отображать файл на память.
3742
Но у меня были сомнения в эффективности скорости подгрузки новых страниц в этом решении.
3843
Так и вышло. Немного медленнее, процентов на 20% (время всей программы).
3944
Хотя тоже странно при прогретом кэше.
40-
Теоретически, если данные в кэше лежат, то можно было бы их отобразить на виртуальную память в read-only режиме за O(1),
45+
Теоретически, если данные в кэше лежат, то можно было бы их отобразить
46+
на виртуальную память в read-only режиме за O(1),
4147
а потом экономить на переходах в kernel mode + экономить на копировании памяти.
4248

4349
## Тестирование и заметки
@@ -57,12 +63,15 @@
5763
В последней версии grep показывает 2.5 секунды, а моё решение - 1.6 секунды на тестовых данных.
5864

5965
**ДОПОЛНЕНО:**
60-
Реализовал также чтение файла в отдельном потоке. Файловая операция синхронная, синхронизация с потоком lock free (spinlock).
61-
Получил общий выигрыш в 25% относительно решения на синхронном и асинхронном API (1.2 секунды). Итого в 2 раза быстрее чем grep.
66+
Реализовал также чтение файла в отдельном потоке. Файловая операция синхронная,
67+
синхронизация с потоком lock free (spinlock).
68+
Получил общий выигрыш в 25% относительно решения на синхронном и асинхронном API (1.2 секунды).
69+
Итого в 2 раза быстрее чем grep.
6270

6371
## Особенности реализации
6472

65-
В итоге у меня остались все три реализации чтения файлов. Я оставил асинхронную версию как самую перспективную. Переключаются так:
73+
В итоге у меня остались все три реализации чтения файлов.
74+
Я оставил асинхронную версию как самую перспективную. Переключаются так:
6675

6776
```cpp
6877
#if 0
@@ -84,7 +93,8 @@
8493

8594
Как и в условии задачи, основное консольное приложение собрано с отключенными исключениями и заодно без RTTI.
8695

87-
Я притянул часть STL на мой страх и риск. Ту часть, которая не требует исключений и работает без лишних накладных расходов.
96+
Я притянул часть STL на мой страх и риск.
97+
Ту часть, которая не требует исключений и работает без лишних накладных расходов.
8898
Не вижу смысла не пользоваться дешевыми абстракциями, позволяющими писать более чистый код
8999
и более защищенный от ошибок программиста. И без велосипедов.
90100
Я имею в виду всякие std::unique_ptr, std::string_view, std::optional.

0 commit comments

Comments
 (0)