我有以下汇编程序,显示字母'z'然后退出:
mov dl, 'z'
mov ah, 2h
int 21h
mov ah, 4Ch
int 21h
我用NASM组装它,结果文件只包含那些说明。 (10个字节)我在批处理文件中对此程序进行了1000次调用,然后对
进行了1000次调用echo z
并且回声的速度提高了约10倍。有谁知道导致这个程序运行得如此缓慢的原因是什么?提前谢谢。
答案 0 :(得分:14)
“echo”是一个内置在命令解释器中的命令;不需要加载代码来执行命令。您的程序虽然很小,但需要在每次调用时读入内存并进行初始化。在它到达那一点之前,命令解释器将搜索PATH以找到该程序,这需要花费大量时间。
答案 1 :(得分:8)
可能这与您的代码关系不大,而与底层操作系统有关。
Echo是命令解释器立即识别的命令。因此,调用echo不会启动新进程;回声发生在命令解释器的范围内。
另一方面,启动小型程序集程序涉及创建一个新进程以及所暗示的所有开销。
答案 2 :(得分:6)
我认为echo命令可能构建在shell中,因此在每次调用时都没有加载新程序的开销
答案 3 :(得分:4)
您的程序使用DOS API。在现代操作系统上,它必须在虚拟机上运行,例如NTVDM或DOSbox。这可能是导致它变慢的主要原因。
您可以使用此代码创建本机可执行文件,该代码应该更快:
bits 32
global main
extern putchar
section .text
main:
push 'z'
call putchar
pop ecx
xor eax, eax
ret
在Unix上,您可以使用以下命令编译和执行它:
nasm file.asm -f elf
gcc file.o -o file
./file
在Windows上,将-f elf
替换为-f win32
。如果您使用Visual Studio的编译器和链接器,请尝试在VS的命令提示符中使用cl file.o
(未经测试)。
答案 4 :(得分:3)
你的程序需要启动1000次,可以内置echo,因此没有启动开销。
答案 5 :(得分:2)
Echo是一个在命令行批处理脚本的上下文中运行的命令。没有执行外部进程,因此执行起来非常快。
你对程序集程序的每次执行都需要启动和停止应用程序,这个操作有一定的开销。
答案 6 :(得分:1)
尝试运行strace <your prog>
- 您将看到执行此小程序的事件所需的shell,链接器等。
答案 7 :(得分:-1)
程序的调用可能需要从缓存外部加载程序(也许回显已经在缓存中?)和许多其他复杂性。此外,您正在调用userland代码,而echo命令可能具有更高的优先级等等。