SemaphoreSlim se basa en SpinWait y Monitor, por lo que el hilo que espera adquirir el bloqueo está quemando ciclos de CPU durante algún tiempo con la esperanza de adquirir el bloqueo antes de ceder a otro hilo. Si eso no sucede, los subprocesos permiten que los sistemas cambien de contexto e intentan nuevamente (quemando algunos ciclos de CPU) una vez que el sistema operativo programa ese subproceso nuevamente. Con esperas largas, este patrón puede consumir una cantidad sustancial de ciclos de CPU. Entonces, el mejor escenario para dicha implementación es cuando la mayoría de las veces no hay tiempo de espera y puede adquirir el bloqueo casi instantáneamente.
Semaphore se basa en la implementación en el kernel del sistema operativo, por lo que cada vez que adquiere el bloqueo, gasta bastantes ciclos de CPU, pero después de eso, el hilo simplemente duerme el tiempo que sea necesario para obtener el bloqueo.