Нахождение времени, затраченного кодом

Я пытаюсь найти время, затраченное функцией memmove в c, используя библиотеку time.h. Однако, когда я выполняю код, я получаю значение как ноль. Любое возможное решение, чтобы найти время, затрачиваемое функцией memmove?

void main(){
uint64_t start,end;
uint8_t a,b;
char source[5000];
char dest[5000];
uint64_t j=0;

for(j=0;j<5000;j++){
source[j]=j;
}

start=clock();
memmove(dest,source,5000);
end=clock();
printf("%f",((double)end-start));
}

person vikrant waje    schedule 08.12.2017    source источник
comment
Сделайте отступ в своем коде (как примеры в учебнике C).   -  person Jabberwocky    schedule 08.12.2017
comment
Вы получаете нулевое значение, потому что запоминание 5000 байтов, вероятно, быстрее, чем результат ваших часов. Расскажите нам больше о вашей платформе.   -  person Jabberwocky    schedule 08.12.2017
comment
Делайте больше работы. Копирование 5000 символов не займет много времени, чтобы его можно было измерить с помощью clock(). Или рассмотрите возможность использования clock_gettime().   -  person Jonathan Leffler    schedule 08.12.2017
comment
Код по-прежнему не имеет отступа.   -  person Jabberwocky    schedule 08.12.2017
comment
Я попробовал приведенный выше код на своем хост-компьютере, который представляет собой 64-битную операционную систему Windows с процессором i7 с тактовой частотой 2,7 ГГц. Кроме того, я попробовал код на моей плате beaglebone с операционной системой Ubuntu и тактовой частотой 1 ГГц.   -  person vikrant waje    schedule 08.12.2017
comment
В случае, если я выполняю больше работы, я могу получить время в конечных секундах, но это время не будет исключительно для времени, необходимого для memmove, верно? @Джонатан Леффлер   -  person vikrant waje    schedule 08.12.2017


Ответы (2)


Как я пишу в своем комментарии, запоминание 5000 байт слишком быстро, чтобы его можно было измерить с помощью clock. Если вы сделаете свой memmove 100 000 раз, то его можно будет измерить.

Этот код ниже дает результат 12 на моем компьютере. Но это зависит от платформы, число, которое вы получите на вашем компьютере, может сильно отличаться.

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <time.h>

int main(void) {
  uint64_t start, end;
  char source[5000];
  char dest[5000];
  uint64_t j = 0;

  for (j = 0; j < 5000; j++) {
    source[j] = j;
  }

  start = clock();

  for (int i = 0; i < 100000; i++)
  {
    memmove(dest, source, 5000);
  }

  end = clock();
  printf("%lld", (end - start));  // no need to convert to double, (end - start)
                                  // is an uint64_t.
 }
person Jabberwocky    schedule 08.12.2017
comment
Это работает с Visual Studio, но не работает с gcc (режим выпуска). Вероятно, оптимизация gcc игнорирует цикл, потому что цикл не влияет на результат программы. Также clock() зависит от CLOCKS_PER_SEC, который в Windows равен 1,000, в *nix, я думаю, обычно 1,000,000 - person Barmak Shemirani; 09.12.2017
comment
можно отключить оптимизацию при компиляции - person Flying Swissman; 09.12.2017

Если вы хотите узнать, сколько времени требуется на бигль-кость или другое устройство с GIPO, вы можете переключать GPIO до и после вашей процедуры. Вам нужно будет подключить осциллограф или что-то подобное, чтобы быстро измерять напряжение.

Я мало что знаю о костях бигля, но кажется, что библиотека libpruio позволяет быстро переключать gpio.

Кроме того, какова ваша точная цель здесь? Сравните скорость на другом оборудовании? Как кто-то предлагает, вы можете увеличить количество циклов, чтобы его было легче измерить с помощью time.h.

person Flying Swissman    schedule 08.12.2017