We have a daemon that contains a lot of print messages. Since we are working on an embedded device with a weak CPU and other constraint hardware, we want to minimize any kinds of costs (IO, CPU, etc..) of printf messages in our final version. (Users don't have a console)
My teammate and I have a disagreement. He thinks we can just redirect everything to /dev/null. It won't cost any IO so affections will be minimal. But I think it will still cost CPU and we better define a macro for printf so we can rewrite "printf" (maybe just return).
So I need some opinions about who is right. Will Linux be smart enough to optimize printf? I really doubt it.
When you redirect the stdout of the program to
/dev/null, any call to
printf(3) will still evaluate all the arguments, and the string formatting process will still take place before calling
write(2), which writes the full formatted string to the standard output of the process. It's at the kernel level that the data isn't written to disk, but discarded by the handler associated with the special device
So at the very best, you won't bypass or evade the overhead of evaluating the arguments and passing them to
printf, the string formatting job behind
printf, and at least one system call to actually write the data, just by redirecting stdout to
/dev/null. Therefore I see little improvement in terms of performance, since the only different thing is actually writing to the device, be it hard disk or terminal, unless they're considerably slow. Disk and RAM capacity (for terminals) may be another concern, though.
Although in theory, the program could detect
/dev/null and perform some optimizations within the restrictions of standards they comply to (ISO C and POSIX), based on general understanding of common implementations, they practically don't (i.e. I am unaware of any Unix or Linux system doing so).
The POSIX standard mandates writing to the standard output for any call to
printf(3), so it's not standard-conforming to suppress the call to
write(2) depending on the associated file descriptors. For more details about POSIX requirements, you can read Damon's answer. Oh, and quick note: All Linux distros are practically POSIX-compliant, despite not being certified to be so.
Be aware that if you replace
printf completely, some side effects may go wrong, for example
printf("%d%n", a++, &b). If you really need to suppress the output depending on program execution environment, consider setting a global flag and wrap up printf to check the flag before printing — it isn't going to slow down the program to an extent where the performance loss is visible, as a single condition check is much faster than calling
printf and doing all the string formatting.