Естественно, я предположил, что операторы < и < = работают с одинаковой скоростью (per Jonathon Reinhart's logic, here). Недавно я решил проверить это предположение, и я был немного удивлен моими результатами.Почему <будет медленнее, чем <=? [C]
Я знаю, что для большинства современных аппаратных средств этот вопрос носит чисто академический характер, поэтому ему приходилось писать тестовые программы, которые занимали около 1 миллиарда раз (чтобы получить любую незначительную разницу, чтобы добавить более приемлемые уровни). Программы были как можно более простыми (чтобы вырезать все возможные источники помех).
lt.c:
int main() {
for (int i = 0; i < 1000000001; i++);
return 0;
}
le.c:
int main() {
for (int i = 0; i <= 1000000000; i++);
return 0;
}
Они были собраны и работают на Linux VirtualBox 3.19.0-18-родового # 18- Ubuntu x86_64 установка с использованием GCC с -std = c11 набор флагов.
Среднее время двоичного lt.c было:
real 0m2.404s
user 0m2.389s
sys 0m0.000s
Среднее время le.c было:
real 0m2.397s
user 0m2.384s
sys 0m0.000s
Разница невелика, но я не мог заставить его уйти или отменить независимо от того, сколько раз я запускал двоичные файлы.
- Я сделал сравнительное значение в цикле for lt.c больше, чем le.c (так что оба цикла будут одинаковыми). Это было как-то ошибкой?
- По ответам Is < faster than <=?,
<
компилируется вjge
и<=
компилируется вjg
. Это касалось if-выражений, а не for-loop, но может ли это быть причиной? Может ли выполнениеjge
взять немного больше, чемjg
? (Я думаю, что это было бы иронично, так как это означало бы переход от C к ASM-инвертированию, который является более сложной инструкцией, причем lt в C переводят на gte в ASM и lte на gt.) - Или это просто поэтому аппаратная особенность, что разные линии x86 или отдельные чипы могут постоянно показывать обратную тенденцию, ту же тенденцию или разницу?
Вы можете попросить компилятор дать вам код на ассемблере и изучить что. –
Оба кода составляют одну и ту же сборку (оба с 'jle'), даже с -O0 (gcc 4.9.2). Разница, вероятно, неконтролируемая артефакт. – ElderBug
Используя '-O3', компилятор должен был оптимизировать петли, а использование оптимизации не имеет смысла. –