我有顯示字母「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