В значительной степени.
Когда вы перенаправляете стандартный вывод программы на /dev/null
, любой вызов printf(3)
будет по-прежнему оценивать все аргументы, и процесс форматирования строки будет происходить до вызова write(2)
, который записывает полностью отформатированную строку на стандартный вывод процесса. На уровне ядра данные не записываются на диск, а отбрасываются обработчиком, связанным со специальным устройством /dev/null
.
Так что, в лучшем случае, вы не будете обходить или уклоняться от накладных расходов, связанных с оценкой аргументов и передачей их printf
, заданием форматирования строки, стоящим за printf
, и хотя бы одним системным вызовом для фактической записи данных. просто перенаправив стандартный вывод на /dev/null
. Ну, это настоящая разница в Linux. Реализация просто возвращает количество байтов, которое вы хотели записать (указано 3-м аргументом вашего вызова для write(2)
), и игнорирует все остальное (см. этот ответ ). В зависимости от объема записываемых данных и скорости целевого устройства (диска или терминала) разница в производительности может сильно различаться. Во встроенных системах, вообще говоря, отключение записи на диск путем перенаправления на /dev/null
может сэкономить довольно много системных ресурсов для нетривиального объема записанных данных.
Хотя теоретически программа может обнаруживать /dev/null
и выполнять некоторые оптимизации в рамках ограничений стандартов, которым они соответствуют (ISO C и POSIX), основываясь на общем понимании общих реализаций, они практически этого не делают (то есть я не подозревая об этом в любой системе Unix или Linux).
Стандарт POSIX предписывает запись в стандартный вывод для любого вызова на printf(3)
, поэтому не соответствует стандарту подавление вызова на write(2)
в зависимости от связанных файловых дескрипторов. Для более подробной информации о требованиях POSIX вы можете прочитать Damon's answer . Да, и небольшое замечание: все дистрибутивы Linux практически POSIX-совместимы, несмотря на то, что они не сертифицированы , чтобы быть таковыми.
Имейте в виду, что если вы полностью замените printf
, некоторые побочные эффекты могут пойти не так, например printf("%d%n", a++, &b)
. Если вам действительно нужно подавить вывод в зависимости от среды выполнения программы, рассмотрите возможность установки глобального флага и оберните printf, чтобы проверить флаг перед печатью - это не приведет к замедлению программы до такой степени, чтобы было видно снижение производительности , так как одиночная проверка условия на намного быстрее, чем вызов printf
и выполнение всего форматирования строки.