Подтвердить что ты не робот

Сложность операторов сравнения

Почему функция y[i] < x[i] занимает в два раза больше времени, когда массив x всегда выше по сравнению с y (для ex 1<x<2 и 0<y<1). Кроме того, при сравнении 0.5<x<1.5 и 0<y<1 время выполнения составляет около 1.5x в случае, когда 0<x<1 и 0<y<1. Предполагается, что x и y являются длинными массивами.

Я добавляю код для вас, чтобы попытаться понять, что я имею в виду. вы можете смещать массив x, увеличивая и уменьшая переменную "смещение (попробуйте смещение = 1 и смещение = 0); Код сохранит время выполнения для циклов в файле Beta.

код:

#include <iostream>
#include <array>
#include <time.h>
#include <math.h>
using namespace std;
#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main()
{
ofstream myfile_Beta;
myfile_Beta.open ("Beta.txt");
clock_t begin_time = clock();
clock_t total_time;
srand (time(NULL));

double offset =0.0;

int m=0;
for(int k=0;k<10000;k++)
    {
    m=1;
    double M[75720],x[75720],y[75720];

    for (int i=0;i<75720;i++)
    {

        x[i]=+(rand()%1024)/1024.0* 1.0 + offset ;
        y[i]=+(rand()%1024)/1024.0* 1.0 + 0.00; 
    }
    begin_time = clock();
    for (int j=0;j<75720;j++)
    {
        M[j]=MAX(x[j],y[j]);
    }   
    total_time =clock () - begin_time;
    myfile_Beta <<float( total_time  )<<" "<<endl;
}
myfile_Beta.close ();
}
4b9b3361

Ответ 1

Одно из объяснений заключается в том, что при первом применении применяется меньшее количество переходов,

Второе объяснение касается предикации ветвления, в основном, где он мог "догадываться" о < результат и применить следующий код независимо от результата, а также отключить его при сбое, поэтому, когда вы выполняете такое же условие относительно много, компилятор может угадывать его правильно чаще. Вы можете прочитать больше об этом здесь: http://en.wikipedia.org/wiki/Branch_predication