assembly - 为什么这种 strcpy 的实现需要更多时间?
问题描述
我是汇编语言的新手。我已经使用 masm 编写了两个 strcpy 实现;一个使用rsi和rdi,另一个不使用。后者花费更少的时间。看来还是推荐使用rsi和rdi来复制数据,后者的looping部分比前者大。但是当我测量性能时,前者花费的时间更多。为什么前者花费更多时间,以及在 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;
}
解决方案
推荐阅读
- c++ - 如何从 CreateProcessW 函数的 lpApplicationName 中修剪空间?
- javascript - 针对另一个表达式的 JSONPath 或 JMESPath 过滤
- javascript - 如何从谷歌地图迁移到 TomTom
- python - 如何在不在任何类内的函数内调用类
- haskell - 在 Haskell 中定义元素
- python-3.x - 使用 matplot lib 绘制列表
- python - 异或两个二进制字符串列表
- c - 频率数字计数
- ruby-on-rails - 让多个图像 URL 呈现相同的图像
- java - hideSoftInputFromWindow 抛出 NoSuchMethodError