У меня есть небольшая программа для вычисления хэшей (для хэш-таблиц). Код выглядит довольно чистым, надеюсь, но есть что-то не связанное с этим, которое меня подталкивает.
Я могу с легкостью генерировать около миллиона хэшей примерно через 0,2-0,3 секунды (сравнивается с /usr/bin/time ). Тем не менее, когда я печатаю их (f) в цикле 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!