Я пытался подсчитать продолжительность, занимаемую циклом for, используя std :: chrono, но он дает 0 наносекунд, даже если я сделаю цикл более длинным, увеличив связанное значение, это код:подсчет продолжительности с std :: chrono дает 0 наносекунды, когда это займет много времени
#pragma pack(1) // dont align let's let it take longer
struct Foo{
int x;
char c;
int z;
} ;
void take_time()
{
Foo f;
auto t1 = std::chrono::system_clock::now();
register int c = 0;
int x=0,y=0,z=1;
for (c=0;c<10000;c++){ // even if i put 1000000000 it will take 0 nanosec !!!!!
f.z = x+y;
f.z += z-x+y;
}
std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}
выход:
token time : 0
но когда я increament границы счетчика цикла очень очень огромное значение он вдруг принимает навсегда !! , если я положил c < 100000000, он принимает 0 наносекук, но если я добавлю «0» справа, это займет навсегда !!
ответ: как сказал WhiZTiM, компилятор удаляет петлю, потому что он не делает ничего полезного (спасибо Gcc < 3), но мы действительно не хотим, чтобы это произошло, когда мы проводим тестирование алгоритмов, чтобы увидеть причем один из них работает быстрее на разных компиляторах (а не на этом spesific), чтобы сделать это, мы можем вставить строку asm в цикл. asm("")
, пустой asm, в любом месте цикла. Это скажет компилятору, что есть некоторые операции низкого уровня, которые он не может оптимизировать! , или мы можем использовать ключевое слово volitile для любой переменной, используемой в цикле, которая не позволяет компилятору выполнять какую-либо оптимизацию, связанную с этой переменной. спасибо всем, я надеюсь, что это помогает
х, у и г не инициализированы. Неопределенное поведение. –
Я добавил их позже, теперь они инициализированы, но проблема сохраняется! –