Приложение A. Рекомендации для разработчиков
- Использование потоков.
- Излишнее или неэффективное пробуждение процессора. Если пробуждение необходимо, выполните необходимые действия быстро и в одно и то же время.
- Излишнее использование
[f]sync()
. - Излишние периодические опросы (лучше применять тактику реагирования на события).
- Низкая эффективность пробуждений.
- Неэффективный доступ к дискам. Рекомендуется использование буферов большего объема для уменьшения частоты запросов доступа к диску и выполнение записи больших блоков за раз.
- Неэффективное использование таймеров. По возможности рекомендуется группировать таймеры для программ (или даже систем);
- Излишние операции ввода и вывода, потребления энергии и использования ресурсов памяти (включая утечку памяти).
- Выполнение вычислений, в которых нет необходимости.
A.1. Использование потоков
В Python используются возможности глобальной блокировки интерпретатора (GIL, Global Interpreter Lock) [1], поэтому выполнение большого числа потоков имеет смысл только для больших объемов операций ввода/вывода.
Потоки Perl изначально предназначались для выполнения программ без ветвления (например, в 32-битных системах Windows). При этом данные копируются в каждый отдельный поток, а совместный доступ к ним по умолчанию не обеспечивается, так как пользователи должны иметь возможность контролировать предоставление общего доступа. Для этого используется модуль threads::shared, который дополнительно создает переменные для данных, что и замедляет обработку. [2]
Потоки C используют память совместно, при этом каждому потоку соответствует отдельный стек, а необходимости в создании ядром новых дескрипторов файлов и выделении дополнительной памяти нет. При этом в параллельных вычислениях может использоваться большее число потоков и принимать участие большее число процессоров. Для оптимизации производительности потоков рекомендуется использовать язык низкого уровня программирования — С или C++. Если же вы предпочитаете работать со сценариями, рекомендуется создавать C-проекции. Специальные инструменты анализа помогут идентифицировать низкопроизводительные секции кода [3].