У меня есть небольшая C-программа для вычисления хешей (для хеш-таблиц). Надеюсь, код выглядит достаточно чистым, но есть кое-что не связанное с ним, что меня беспокоит.
Я могу легко сгенерировать около миллиона хэшей за 0,2-0,3 секунды (с помощью / usr / bin / time). Однако, когда я printf () вставляю их в цикл for, программа замедляется примерно до 5 секунд.
- Почему это?
- Как сделать это быстрее? Может быть, mmapp () в стандартный вывод?
- Как в связи с этим разработан stdlibc и как его можно улучшить?
- Как ядро могло бы поддерживать его лучше? Как его нужно изменить, чтобы сделать пропускную способность локальных «файлов» (сокетов, каналов и т. Д.) Действительно быстрой?
Я с нетерпением жду интересных и подробных ответов. Спасибо.
PS: это набор инструментов для компиляции, так что не стесняйтесь вдаваться в детали. Хотя это не имеет ничего общего с самой проблемой, я просто хотел указать, что детали меня интересуют.
Добавление
Я ищу более программные подходы к решениям и объяснениям. В самом деле, трубопровод выполняет свою работу, но я не могу контролировать то, что делает «пользователь».
Конечно, я сейчас провожу тестирование, которое не будет сделано "обычными пользователями". НО это не меняет того факта, что простое printf () замедляет процесс, и это проблема, для которой я пытаюсь найти оптимальное программное решение.
Приложение - Потрясающие результаты
Базовое время указано для простых вызовов printf () внутри TTY и занимает около 4 минут 20 секунд.
Тестирование в / dev / pts (например, Konsole) ускоряет вывод примерно до 5 секунд.
При использовании setbuffer () в моем тестовом коде требуется примерно столько же времени для размера 16384, почти то же самое для 8192: около 6 секунд.
setbuffer () не имеет очевидно эффекта при его использовании: это занимает столько же времени (на TTY около 4 минут, на PTS около 5 секунд).
Удивительно, что , если я запускаю тест на TTY1, а затем переключаюсь на другой TTY , это займет точно так же, как на PTS: около 5 секунд .
Заключение : ядро делает что-то, что связано с доступностью и удобством пользователя. Да!
Обычно он должен быть одинаково медленным, независимо от того, смотрите ли вы на TTY, пока он активен, или переключаетесь на другой TTY.
Урок : при запуске программ с интенсивным выходом переключайтесь на другой TTY!