【发布时间】:2010-10-30 11:15:09
【问题描述】:
我有以下汇编程序,它显示字母“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 以找到程序,这需要大量时间。
【讨论】:
这可能与您的代码关系不大,而与底层操作系统有关。
回显是命令解释器立即识别的命令。因此,调用 echo 不会启动新进程;回显发生在命令解释器的范围内。
另一方面,启动您的小型汇编程序涉及创建一个新进程以及由此产生的所有开销。
【讨论】:
我认为 echo 命令可能会内置到 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(未经测试)。
【讨论】:
如果您的程序需要启动 1000 次,可能会内置 echo,因此没有启动开销。
【讨论】:
Echo 是在命令行批处理脚本的上下文中运行的命令。没有外部进程在执行,所以执行起来非常快。
您每次执行汇编程序都需要启动和停止应用程序,该操作有一定的开销。
【讨论】:
尝试运行strace <your prog> - 你会看到shell、链接器等都必须做些什么来执行这个小程序的事件。
【讨论】:
程序的调用可能需要从缓存外部加载该程序(也许 echo 已经在缓存中?)以及许多其他复杂性。此外,您正在调用用户空间代码,而 echo 命令可能具有更高的优先级,等等。
【讨论】: