gpt4 book ai didi

c - 为什么 memcmp 比 for 循环检查快得多?

转载 作者:太空狗 更新时间:2023-10-29 16:23:27 27 4
gpt4 key购买 nike

为什么 memcmp(a, b, size) 比:

for(i = 0; i < nelements; i++) {
if a[i] != b[i] return 0;
}
return 1;

memcmp 是 CPU 指令还是什么?它一定很深,因为我在循环中使用 memcmp 获得了巨大的加速。

最佳答案

memcmp 通常在汇编中实现,以利用许多特定于体系结构的功能,这可以使其比 C 中的简单循环快很多。 p>

作为“内置”

GCC 支持 memcmp(以及大量其他功能)作为 builtins .在 GCC 的某些版本/配置中,对 memcmp 的调用将被识别为 __builtin_memcmp。 GCC 不会发出对 memcmp 库函数的调用,而是发出少量指令来充当该函数的优化内联版本。

在 x86 上,这利用了 cmpsb 指令的使用,该指令将一个内存位置的字节串与另一个内存位置进行比较。这与 repe 前缀相结合,因此比较字符串直到它们不再相等,或者计数用尽。 (正是 memcmp 所做的)。

给定以下代码:

int test(const void* s1, const void* s2, int count)
{
return memcmp(s1, s2, count) == 0;
}
Cygwin 上的

gcc 版本 3.4.4 生成以下程序集:

; (prologue)
mov esi, [ebp+arg_0] ; Move first pointer to esi
mov edi, [ebp+arg_4] ; Move second pointer to edi
mov ecx, [ebp+arg_8] ; Move length to ecx

cld ; Clear DF, the direction flag, so comparisons happen
; at increasing addresses
cmp ecx, ecx ; Special case: If length parameter to memcmp is
; zero, don't compare any bytes.
repe cmpsb ; Compare bytes at DS:ESI and ES:EDI, setting flags
; Repeat this while equal ZF is set
setz al ; Set al (return value) to 1 if ZF is still set
; (all bytes were equal).
; (epilogue)

引用:

作为库函数

memcmp 的高度优化版本存在于许多 C 标准库中。这些通常会利用特定于体系结构的指令来并行处理大量数据。

在Glibc 中,有memcmp 的版本for x86_64可以利用以下指令集扩展:

最酷的部分是 glibc 将检测(在运行时)您的 CPU 拥有的最新指令集,并执行为其优化的版本。请参阅 sysdeps/x86_64/multiarch/memcmp.S 中的此片段:

ENTRY(memcmp)
.type memcmp, @gnu_indirect_function
LOAD_RTLD_GLOBAL_RO_RDX
HAS_CPU_FEATURE (SSSE3)
jnz 2f
leaq __memcmp_sse2(%rip), %rax
ret

2: HAS_CPU_FEATURE (SSE4_1)
jz 3f
leaq __memcmp_sse4_1(%rip), %rax
ret

3: leaq __memcmp_ssse3(%rip), %rax
ret

END(memcmp)

在Linux内核中

Linux 似乎没有为 x86_64 优化的 memcmp 版本,但在 arch/x86/lib/memcpy_64.S 中为 memcpy 提供了优化版本.请注意,它使用 alternatives 基础架构 ( arch/x86/kernel/alternative.c ) 不仅在运行时决定使用哪个版本,而且实际上修补自身以仅在启动时做出此决定-上。

关于c - 为什么 memcmp 比 for 循环检查快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21106801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com