Учитывая следующие тестовые программы:Почему разыменование делает мою программу быстрее?
int main(void) {
int iterations = 1000000000;
while (iterations > 0)
-- iterations;
}
Loop value on the stack (dereferenced)
int main(void) {
int iterations = 1000000000;
int * p = & iterations;
while (* p > 0)
-- * p;
}
#include <stdlib.h>
int main(void) {
int * p = malloc(sizeof(int));
* p = 1000000000;
while (*p > 0)
-- * p;
}
путем составления их -O0, я получаю следующее экс ecution раз:
case1.c
real 0m2.698s
user 0m2.690s
sys 0m0.003s
case2.c
real 0m2.574s
user 0m2.567s
sys 0m0.000s
case3.c
real 0m2.566s
user 0m2.560s
sys 0m0.000s
[править] Ниже среднее по 10 казней:
case1.c
2.70364
case2.c
2.57091
case3.c
2.57000
Почему время выполнения больше с первым тестом, который кажется самым простым?
Моя текущая архитектура - это виртуальная машина x86 (Archlinux). Я получаю эти результаты как с gcc (4.8.0), так и с clang (3.3).
[edit 1] Созданные коды ассемблера почти идентичны, за исключением того, что второй и третий имеют больше инструкций, чем первый.
[edit 2] Эти характеристики воспроизводимы (в моей системе). Каждое исполнение будет иметь тот же порядок величины.
[edit 3] Мне действительно не нравятся выступления неоптимизированной программы, но я не понимаю, почему это было бы медленнее, и мне любопытно.
Попробуйте просмотреть сгенерированный код? Почему вы все равно заботитесь о производительности неоптимизированного кода? –
Хе вы пытались запустить их в другом порядке? Являются ли эти однократные или средние значения значительным числом прогонов? – EJP
@CarlNorum Почти такой же сгенерированный код, за исключением того, что в последних двух примерах есть больше инструкций (move & load). Меня не волнуют представления, но мне все еще любопытно :) –