Измерьте время, необходимое для выполнения функции сборки

У меня есть следующая программа сборки, и в качестве своего рода теста я хотел бы посмотреть, как работает функция 1B-приращения. Как наиболее точно рассчитать это время?

SYS_EXIT = 60
LOOP_MAX = 1000000000
.globl _start

loop:
    # do a billion increments
    mov $0, %eax
  _loop:
    inc %eax
    cmp $LOOP_MAX, %eax
    jne _loop
    ret

_start:

    # start time
    call loop
    # printf("It took %.8f to run", end_time - start_time)

    mov $0,  %edi
    mov $SYS_EXIT, %eax
    syscall

person David542    schedule 19.02.2021    source источник
comment
Вы можете использовать инструкцию rdtsc, но не так-то просто преобразовать ее в единицы реального времени, например секунд. Или вы можете вызвать системный вызов, например clock_gettime.   -  person Nate Eldredge    schedule 19.02.2021
comment
@NateEldredge Понятно, не могли бы вы показать пример того, как это сделать? Я полагаю, что для этой цели подойдет разница в количестве циклов щелчков.   -  person David542    schedule 19.02.2021
comment
Сказать особо нечего: он дает вам количество тактов в edx:eax. Если вы хотите, чтобы это было в 64-битном регистре, вы можете сделать mov %edx, %ecx ; shl $32, %rcx ; add %rax, %rcx. Затем сделайте это снова после завершения цикла и вычтите.   -  person Nate Eldredge    schedule 19.02.2021
comment
@NateEldredge: если вы синхронизируете такие вещи в asm, обычно имеет смысл рассчитывать время с точки зрения тактовых циклов ядра (чтобы убедиться, что этот цикл выполняется точно с ожидаемой 1 итерацией за цикл). В этом случае RDTSCP в NASM всегда возвращает одно и то же значение (синхронизация одной инструкции) показывает полный пример синхронизации цикла в статический исполняемый файл с использованием perf stat.   -  person Peter Cordes    schedule 19.02.2021
comment
@PeterCordes отлично, спасибо за ссылку. Кстати: что вы имеете в виду под *core* clock cycles?   -  person David542    schedule 19.02.2021
comment
Я имею в виду тики фактических часов, на которых работает ядро ​​процессора. Например, если ваш процессор работает на максимальной частоте 4,2 ГГц, частота ядра составляет 4,2 ГГц. В отличие от опорной частоты, используемой TSC (считываемой RDTSC); он тикает с постоянной частотой независимо от того, что делает ядро ​​ЦП, что делает его полезным источником времени для абсолютного реального времени, но не для циклов процессора. (например, на моем i7-6700k с частотой 4 ГГц, на частоте 4008 МГц). См. Как получить счетчик циклов ЦП в x86_64 из C ++? для получения дополнительной информации о RDTSC.   -  person Peter Cordes    schedule 19.02.2021