"Warten" ist in der Regel das Ungünstigste. Weil in dieser Zeit nichts anderes passieren kann, außer Interrupts. Sleep() und sleep() sind wirklich nur ein Notbehelf. Besser ist die Verwendung eines Timers und einer Timer-Routine. Die nutzt dann Interrupts und es kommt nicht zum "Lahmlegen" des Prozessors.
In Windows und Unix (Linux) wird Sleep(), sleep() und nanosleep() dennoch verwendet, weil es Multitasking-OS sind, die in dieser Zeit, wo das eigene Programm steht, noch was anderes machen können.
Nur beim Mikrocontroller ohne solch ein OS gibt es nichts anderes, was noch gemacht werden könnte - es sei denn, es wurde so programmiert. Z.B. mit Task-Scheduling, Interrupts, etc.

Meine Empfehlung: sind es nur ganz kurze Zeiten - dann Controller mit einer Zählschleife beschäftigen. Sind es längere Zeiten: Programm umschreiben, wie oben beschrieben.

Blackbird