[О блоге]
[наверх]
[пред]
[2021-04-08 15:22:58+03:00]
[989c4b0aedc76eeaa57b22721ef3431019068c3c]
Удивительно медленные операции
https://gregoryszorc.com/blog/2021/04/06/surprisingly-slow/
Понравилась статья о том, что на наших мощнейших компьютерах, некоторые
операции могут быть на удивление медленными.
* Environment detection in build system
Множество раз замечал что, действительно, сама сборка софта может
занимать в разы меньше времени чем отработка autoconf ./configure
скрипта. На работе когда я перевёл Си проект, в котором прилично вещей
автоматически определяется, на redo, то все эти цели стали
распараллеливаться и конфигурирование плюс сборка занимают пару секунд
* Про fork/exec overhead и file close на Windows системе не в курсе, ибо
не работаю с этим миром в принципе
* То что можно в разы ускорить сборку софта просто не заставляя выводить
это всё в терминал -- давно знал. Медленные терминалы это ещё какая
реальность, особенно часто они почему-то являются default-ными в
системе. Ну и то, что сам по себе системный вызов write() имеет вполне
себе ощутимый вес -- об этом тоже не забываю и вовсю стараюсь
буферизировать данные в памяти перед его вызовом
* С изменением частоты процессора не особо знаком. Уже давно все
ноутбуки держу в режиме постоянного числодробления и полного
отключения всех этих фич по управлению питанием и частотами -- и
стабильность и простота. Но да, помню что читал про забавный факт о
том что если заряжать Apple ноутбуки не с той стороны -- то будет
падение производительности. И особенно на текущем ноутбуке я замечал
что запустив какую-то ресурсоёмкую задачу можно поднять частоту,
соответственно и производительность и снизить время выполнения многих
команд, из-за которых процессор даже не попытается ускориться. У меня
в фоне distributed.net числодробящий клиент висит с idprio 31
приоритетом поэтому. Экономия это конечно хорошо, но всему должна быть
мера
* Время запуска интерпретаторов Python, Ruby, Node.js -- оно просто
громадное! Именно только из-за этого времени я множество скриптов и
программ переписывал на другом языке. Запуск долгоживущего сервера --
не критично сколько будет запускаться, но если это часто вызываемая
утилита (даже просто для ведения заметок), то жутко угнетает видимая
задержка
* Раздел про I/O я не очень понял. Ну точнее я прекрасно понимаю почему
fsync() может быть достаточно медленной операцией -- для меня это не
вызывает удивления. Видимо, потому что любил читать и понимать
устройства файловых систем. Ну а то что из-за NVMe действительно
кардинально может меняться подход к I/O -- это да, факт. С NVMe I/O
может перестать быть бутылочным горлышком, чем оно де-факто всюду и
везде всегда являлось
* И отсюда, соответственно, появляется и тот факт, что сжатие данных
может наоборот вести к тому, что CPU будет узким местом, а не дисковая
подсистема или сеть. Благо, у меня чёткое осознание что нужно
проверять где и в чём затык, а не слепо что-то там пытаться сжимать.
Иногда сжатие может помочь с уменьшением кол-ва round-trip-ов, из-за
уменьшенного кол-ва пакетов, тем самым сокращая задержки, хотя
запросто и ни капли не увеличивая пропускной способности
* Тема про то, что заранее скомпилированные пакеты/бинари могут не иметь
кучу оптимизаций под современные процессоры -- мне тоже хорошо
знакома. Когда я пользовался FreeBSD на AMD K6-2 233MHz, то точно
помню перекомпилирование всей системы/ядра/софта с нужным -march
позволяло на 10% поднимать производительность в целом. Ещё один довод
чтобы собирать софт из исходников. Хотя я скорее поверю и в то, что в
общем случае для yet another home computer или yet another server все
эти оптимизации не существенно чем будут помогать. А CPU-hungry софт и
так следит за тем чтобы собираться с нужными оптимизациями
* Тема про то, что банальное разбиение на строки может быть более долгой
операцией чем целые алгоритмы создающие diff на основе этого -- мне
тоже понятна. И, честно, когда в Go приходится что-то делать над
каждым байтом/символом просто итерируясь -- скрепя сердцем, закрываю
на это глаза, слепо надеясь (зная что это наверняка не так) что
компилятор мог бы это и прооптимизировать
Но вообще это отличные примеры того что нужно всегда всё мерить, а не
делать предположения, если неизвестно устройство/особенности. Без устали
повторяют про то, что надо оптимизировать нечто только после измерений и
понимания что действительно такое то место является бутылочным горлышком.
[оставить комментарий]