Intereting Posts
Функция случайных чисел является пропуском зажигания C – Если используется realloc, это бесплатно? Существуют ли какие-либо преимущества для НЕ использования прототипов функций в C? Как настроить контрастность в OpenCV в C? Странное поведение глобальной переменной, после изменения имени переменной, исчезает Запись в файл с использованием fputs в C C, что мне не хватает для этой программы контрольных операторов? Построение дерева синтаксиса из префиксного выражения в c Почему я должен объявлять размер параметра массива C в заголовке функции? Моя функция сравнения Qsort вызывает странные вещи в памяти как преобразовать строку в шестнадцатеричный код ASCII в C преобразовать фракцию в строку, а также вставить для повторной части требование привилегий root для функций libpcap Как настроить Eclipse для удаленной отладки C с помощью gdbserver? CTypes error loading DLL, вызывающая другую DLL

Несоответствие часового пояса MATLAB и C

Я написал код 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).

Здесь можно заметить два очень странных факта:

  1. Время выполнения для всей функции меньше времени выполнения части кода. Следовательно, измерения MATLAB или C сильно неточны.
  2. Время выполнения, измеренное в коде C, очень разбросано и имеет очень высокое значение. отклонение (коэффициент вариации 44%, по сравнению с 13% для tic-toc).

Что происходит с этими таймерами?

Вы сравниваете яблоки с апельсинами.

Посмотрите документацию Matlab:

tichttp://www.mathworks.com/help/matlab/ref/tic.html
tochttp://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.

Итак, что может объяснить вашу разницу:

  • Время CPU (измеренное с помощью clock ()) и реальное прошедшее время (измеренное tic и toc) НЕ совпадают. Итак, вы ожидаете, что время процессора будет меньше, чем прошлое? Хорошо, может быть. Что делать, если в течение 0.0011s вы управляете 10 ядрами на 100%? Это означает, что измерение clock () равно 10x, которое измеряется с помощью tic и toc. Возможно, маловероятно.
  • clock (.) является крайне неточным и соответствует документации, это приблизительное измерение времени процессора! Я подозреваю, что он привязан к размеру планировщика, но я не пропустил код ядра Linux для проверки. Я также не проверял другие ОС, но блог этого чувака согласуется с этой теорией.

Итак, что делать … для начала, сравните яблоки с яблоками! Затем убедитесь, что вы учитываете разрешение таймера.