Итак, я ставил отметку о тесте C ++, пока наш старший программист отсутствовал, и самый первый вопрос был примерно таким:
Какой метод будет работать быстрее без оптимизации компилятора?
Метод 1
for(int i = 0; i < 100000; i++) { }
Способ 2
for(int i = 100000; i >= 0; --i) { }
Теперь, если вы похожи на меня и почти всех других разработчиков, с которыми я встречался (за исключением одного), вас заставили поверить, что операторы предварительного приращения и предварительного декремента (++i
и --i
) по своей сути медленнее, чем пост операторы инкремента и постдекремента. Поэтому, естественно, я выбрал метод 2.
Однако наш старший программист возвращается и сообщает мне, что две функции будут выполняться в равное время.
Подумав, что это какая-то тщательно продуманная шутка, я решил доказать, что он неправ, и придумал следующее:
#define ITERATIONS (1000000000)
clock_t start = clock();
for(int64_t i = 0; i < ITERATIONS; i++)
{}
auto first_clock = clock() - start;
start = clock();
for(int64_t j = ITERATIONS; j > 0; --j)
{}
auto last_clock = clock() - start;
К моему большому удивлению:
first_clock = 25333
last_clock = 25277
Во всех смыслах и целях эти методы равны!
Итак, откуда появился этот миф? Было ли это правдой когда-то, а в новых компиляторах стало ложью? Жду интересного обсуждения. :)
i++
?? - person πάντα ῥεῖ   schedule 27.08.2013big_integer
. По этой причине в C ++ принято отдавать предпочтение предварительным инкрементам. - person nosid   schedule 27.08.2013std::vector <...>::iterator
). Кроме того, я никогда не видел никакого преимущества в производительности для интегральных (т. Е.int
) типов данных. - person Andon M. Coleman   schedule 27.08.2013