Я написал код C, который я называю формой MATLAB после компиляции с помощью MEX. Внутри кода C я измеряю время части вычисления, используя следующий код:
clock_t begin, end; double time_elapsed; begin = clock(); /* do stuff... */ end = clock(); time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);
Истекшее время должно быть временем выполнения в секундах.
Затем я time_elapsed
значение time_elapsed
в MATLAB (оно правильно экспортировано, я проверил). Затем, со стороны MATLAB, я вызываю эту функцию C (после ее компиляции с использованием MEX), и я измеряю ее время выполнения с помощью tic
и toc
. То, что оказывается полной абсурдностью, заключается в том, что время, которое я вычисляю с использованием tic и toc, составляет 0.0011s (в среднем на 500 прогонов, st. Dev. 1.4e-4), а время, возвращаемое кодом C, равно 0.037s ( в среднем на 500 прогонов, ст. д. 0,0016).
Здесь можно заметить два очень странных факта:
Что происходит с этими таймерами?
Вы сравниваете яблоки с апельсинами.
Посмотрите документацию Matlab:
tic – http://www.mathworks.com/help/matlab/ref/tic.html
toc – http://www.mathworks.com/help/matlab/ref/toc.html
tic и toc позволяют измерять реальное прошедшее время.
Теперь посмотрим на функцию часов http://linux.die.net/man/3/clock .
Особенно,
Функция clock () возвращает приблизительное время процессора, используемое программой.
Возвращаемое значение – это время процессора, используемое в качестве clock_t; чтобы получить количество секунд, разделите на CLOCKS_PER_SEC. Если используемое время процессора недоступно или его значение не может быть представлено, функция возвращает значение (clock_t) -1.
Итак, что может объяснить вашу разницу:
Итак, что делать … для начала, сравните яблоки с яблоками! Затем убедитесь, что вы учитываете разрешение таймера.