我用 C 编写了众所周知的交换函数,并使用 gcc S 观看了汇编输出,并再次做了同样的事情,但对 O2 进行了优化
差异非常大,因为与 20 行相比,我只看到了 5 行。
我的问题是,如果优化真的有帮助,为什么不一直使用它?为什么我们非优化编译代码?
给业内人士一个额外的问题,当您在测试后发布程序的最终版本时,您是否进行了优化编译?
我正在回复您的所有评论,请阅读。
我有memchr我要使非分支的这段代码:
.globl memchr
memchr:
mov %rdx, %rcx
mov %sil, %al
cld
repne scasb
lea -1(%rdi), %rax
test %rcx, %rcx
cmove %rcx, %rax
ret
Run Code Online (Sandbox Code Playgroud)
我不确定是否cmove是分支指令。是吗?如果是这样,如何重新排列我的代码,使其不分支?
assembly x86-64 cpu-architecture micro-optimization branch-prediction
我听说
strlen()C 标准库中的字符串操作(例如)访问和操作字符串的字符,一次一个字符。以上是真的吗?
有哪些解决方案可以提高字符串操作的时间性能?
在我的源代码中,我看到了arm编译器的奇怪行为,它对字符串进行了冗余迭代,这是不必要的。我在这里展示了一个最小的例子来说明这一点,并在下面提出我的问题
#include <string.h>
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
int MAX_FILE_NAME = 2500;
int F(char *file){
int file_len = MIN(strlen(file), MAX_FILE_NAME - 1);
return file_len;
}
int main(void) {
F(__FILE__);
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
编译为:
arm-none-eabi-gcc -nostdlib -Xlinker -Map="m7_experiments.map" -Xlinker --cref -Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -T "m7_experiments_Debug.ld" -o "m7_experiments.axf" ./src/cr_startup_cm7.o ./src/crp.o ./src/flashconfig.o ./src/m7_experiments.o
Run Code Online (Sandbox Code Playgroud)
导致:
Dump of assembler code for function F:
0x00000104 <+0>: push {r4, lr}
0x00000106 <+2>: mov r4, r0
0x00000108 …Run Code Online (Sandbox Code Playgroud) assembly ×3
c ×3
arm ×1
c-strings ×1
gcc ×1
optimization ×1
performance ×1
string ×1
x86-64 ×1