2014-11-06 4 views
-3

Мое предположение было бы в том, что в версии c89 Version 1 быстрее, потому что sizeof - это оператор времени компиляции, поэтому мы будем сравнивать с константой. Но в c99 мы можем взять sizeof VLA, поэтому sizeof является оператором времени выполнения. Итак, какой из них быстрее в c99? И какой из них быстрее в c89?Что происходит быстрее при сравнении циклов?

Один определить и массив для обоих из них:

#define NUM_ROWS(x) (int) (sizeof(x)/sizeof((x)[0])) 

int x[5] = { 0 }; 

Версия 1:

int i; 
for (i = 0; i < NUM_ROWS(x); i++) { 
    // code 
} 

Версия 2:

const int length = NUM_ROWS(x); 
int i; 
for (i = 0; i < length; i++) { 
    // code 
} 
+3

Какой из них у вас профиль? Никто, один из них, или оба? – usr2564301

+3

Этот вопрос не имеет никакого смысла в реальном мире ИМО. Я уверен, что большинство компиляторов достаточно умен, чтобы выяснить, изменит ли значение sizeof его значение или нет во время выполнения цикла и оптимизирует его. Тем не менее, это, вероятно, не обязательно, поэтому он зависит от компилятора и оптимизации. – luk32

+0

@Jongware Оба из них. Но я не мог сделать это правильно, если честно, это не такая простая задача, чтобы выполнять профиль без предубеждений. (И мне никогда не приходилось использовать инструменты для профилирования раньше) – user10607

ответ

1

Единственный верный ответ на то, что быстрее: измерение.

Таким образом, в версии 1 вы оцениваете и завершаете условие на каждой итерации своего цикла, а в версии 2 вы оцениваете его только один раз.

Даже если SizeOf является постоянным, если вы компилятор может поставить постоянное значение непосредственно в регистр для сравнения в версии 1, он, вероятно, мог бы сделать то же самое в версии 2.

Так version2 в теории быстрее или в худшем же скорость, чем версия 1 (скорее всего, для постоянного выражения).

+0

«* всегда быстрее и в худшем случае такая же скорость *« <- Так всегда быстрее или нет? Всегда всегда. – luk32

+0

@ luk32 хорошо, я использовал еще несколько педантичных слов;) – Drax

+0

Извините за nitpicking, но я ценю логику, может быть, слишком высокую =). Также моя ставка заключается в том, что 99,9% механизмов оптимизации поймут, что это инвариант цикла и рассматривать его как константу. – luk32

1

sizeof является только оценивается во время выполнения если VLA является частью выражения.

Поскольку это не тот случай, это будет просто константа времени компиляции, и вы получите ту же производительность.

Смежные вопросы