我有显示字母“Z”,然后退出以下汇编程序:为什么这么小的程序集很慢?
mov dl, 'z'
mov ah, 2h
int 21h
mov ah, 4Ch
int 21h
我与NASM组装它和产生的文件只包含那些指令。 (10个字节)我把1000调用该程序在一个批处理文件,然后1000调用
echo z
和回声运行约快10倍。有谁知道什么会导致这个程序运行如此缓慢?提前致谢。
我有显示字母“Z”,然后退出以下汇编程序:为什么这么小的程序集很慢?
mov dl, 'z'
mov ah, 2h
int 21h
mov ah, 4Ch
int 21h
我与NASM组装它和产生的文件只包含那些指令。 (10个字节)我把1000调用该程序在一个批处理文件,然后1000调用
echo z
和回声运行约快10倍。有谁知道什么会导致这个程序运行如此缓慢?提前致谢。
“echo”是内置在命令解释器中的命令;不需要加载代码来执行该命令。您的程序很小,需要读入内存并在每次调用时进行初始化。在它达到那一点之前,命令解释程序将搜索PATH来查找程序,这需要很长时间。
其中您的程序需要启动1000次,回声可能内置在因此没有启动开销。
Echo是在命令行批处理脚本的上下文中运行的命令。没有外部进程正在执行,所以执行起来非常快。
每次执行汇编程序都需要启动和停止应用程序,该操作有一定的开销。
我想echo命令可能建设成壳,所以没有在每次调用加载一个新的程序的开销
很有可能在有少做你的代码,并更多地与底层操作系统。
Echo是立即由命令解释器识别的命令。因此,调用回声不会启动一个新的过程;回声发生在命令解释器的范围内。
另一方面,启动您的小型装配程序涉及创建一个新流程和所有意味着的开销。
程序的调用可能需要程序从缓存外部加载(可能echo已经在缓存中?)以及其他一些复杂的内容。此外,您正在调用用户级代码,而echo命令可能具有更多优先级等。
尝试运行strace <your prog>
- 您将看到执行事件这个小程序需要执行什么shell,链接器等。
您的程序使用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
(未经测试)。
我不认为内置命令和用户程序的优先级有任何区别。 – 2009-06-01 17:53:43