Ассемблер посмотрите, который выдает компилятор.
Компилятор не всегда догадывается оптимизировать.
На глаз кажется у них меньше условных переходов, а ваш код так написан что компилятор не придумает ему оптимизацию.
У них 2 if'а станут одним условным переходом. У вас - 1 if им станет.
В цикле у вас больше проверок, не догадывается компилятор за скобки вынести - он же не учится как нейросеть или человек.