Почему эта реализация strcpy стоит больше времени? - PullRequest
0 голосов
/ 19 мая 2018

Я новичок в ассемблере.Я написал две реализации strcpy, используя masm;один использует rsi и rdi , а другой нет.Последний стоит меньше времени.Кажется, что рекомендуется использовать rsi и rdi для копирования данных, а последний имеет большую часть зацикливания, чем предыдущая.Но когда я измерил производительность, первый стоил больше времени.Почему первый стоит больше времени, и каков рекомендуемый способ (рекомендуемые инструкции или регистры) для обработки строк в сборке x86-64?

strcpy с использованием rsi и rdi :

custom_strcpy proc

    mov     rsi,    rdx
    mov     rdi,    rcx
    mov     rax,    rdi

_loop:

    movsb
    mov     r8d,    [rsi]
    cmp     r8d,    0
    jne     _loop

_end:

    mov     byte ptr[rdi],  0
    ret


custom_strcpy endp

strcpy не использует rsi и rdi :

custom_strcpy proc

    mov     rax,    rcx

_loop:
    mov     r8b,    byte ptr[rdx]
    mov     byte ptr[rcx],  r8b
    inc     rcx
    inc     rdx
    cmp     r8b,        0
    jne     _loop

ret

custom_strcpy endp

C ++ код, который я использовал для измерения производительности:

#include <iostream>
#include <chrono>
#include <cstring>

#define TIMES 100000000

using namespace std;
using namespace std::chrono;

extern "C" char * custom_strcpy(char * dst, const char * src);

extern "C" void foo()
{
    char src[] = "Hello, world!";
    char dst[sizeof(src)];

    auto start = high_resolution_clock::now();
    for (int i = 0; i < TIMES; i++)
    {
        strcpy(dst, src);
    }
    auto end = high_resolution_clock::now();
    cout << duration_cast<duration<double>>(end - start).count() << endl;

    start = high_resolution_clock::now();
    for (int i = 0; i < TIMES; i++)
    {
        custom_strcpy(dst, src);
    }
    end = high_resolution_clock::now();
    cout << duration_cast<duration<double>>(end - start).count() << endl;
}
...