Man produces faster code. Compilers actually don't know anything about conveyors and rightly so — they are very different on different processors, so optimizing for one will worsen the speed on the other. Just insert NOP'ov demonstrates this. A function can be accelerated by 5-10%, so why the compiler didn't insert nop this?! All they do is align the loops. This work is easy automatiseret macros.
When talking about the NP-completeness of program optimization and compiler to sort out the many options people completely forget about that man and computer are playing by different rules — the person is not limited to the source program, and can do optimizations that the compiler is prohibited (for example, a person can know that certain pointers are not aliases during normal operation of the program; turn the cycle because the specification stated that the procedure for issuing results is not important) or to use designs that are not in the programming language (simultaneous division and obtaining the remainder multiplying 32-bit integers with 64-bit result). And the more complex the algorithm, the greater the number of cases in humans compared to a compiler.
It should be noted that knowing how the algorithm will look best at a low level, it is possible to help the compiler, making optimizations are prohibited for him. Usually this can even add optimization, which the compiler does not know or does not consider it necessary to use (trying to make the code smaller for example). As a result, in many cases it turns out the code comparable with Assembly language, but this merit is not of the compiler.