Почему такая маленькая программа сборки такая медленная? - PullRequest
2 голосов
/ 01 июня 2009

У меня есть следующая программа сборки, которая отображает букву 'z' и затем завершается:

mov dl, 'z'
mov ah, 2h
int 21h
mov ah, 4Ch
int 21h

Я собрал его с NASM, и полученный файл содержит только эти инструкции. (10 байт) Я поместил 1000 вызовов этой программы в пакетный файл, а затем 1000 вызовов на

echo z

и эхо работает примерно в 10 раз быстрее. Кто-нибудь знает, что заставило бы эту программу работать так медленно? Заранее спасибо.

Ответы [ 8 ]

14 голосов
/ 01 июня 2009

«эхо» - это команда, встроенная в интерпретатор команд; для выполнения команды не требуется загружать код. Ваша маленькая программа должна быть прочитана в памяти и инициализирована каждый раз, когда она вызывается. Прежде чем он достигнет этой точки, интерпретатор команд будет искать в PATH, чтобы найти программу, которая занимает значительное время.

8 голосов
/ 01 июня 2009

Скорее всего, это связано не столько с вашим кодом, сколько с базовой операционной системой.

Эхо - это команда, которая немедленно распознается интерпретатором команд. Таким образом, вызов echo не инициирует новый процесс; эхо происходит в области действия интерпретатора команд.

С другой стороны, запуск вашей небольшой программы сборки подразумевает создание нового процесса и всех накладных расходов, которые это подразумевает.

6 голосов
/ 01 июня 2009

Я думаю, что команда echo может быть встроена в оболочку, поэтому нет необходимости загружать новую программу при каждом вызове

4 голосов
/ 01 июня 2009

Ваша программа использует 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, попробуйте использовать cl file.o в командной строке VS (не проверено).

3 голосов
/ 01 июня 2009

, где ваша программа должна быть запущена 1000 раз, эхо может быть встроено, таким образом, нет затрат на запуск.

2 голосов
/ 01 июня 2009

Echo - это команда, которая выполняется в контексте вашего командного сценария командной строки. Внешний процесс не выполняется, поэтому он выполняется очень быстро.

Каждое ваше выполнение программы сборки требует запуска и остановки приложения, для этой операции есть определенные издержки.

1 голос
/ 01 июня 2009

Попробуйте запустить strace <your prog> - вы увидите, что нужно сделать оболочке, компоновщику и т. Д., Чтобы выполнить событие этой крошечной программы.

0 голосов
/ 01 июня 2009

Возможно, что для вызова программы требуется, чтобы программа была загружена из-за пределов кэша (возможно, эхо уже было в кэше?) И ряда других сложностей. Кроме того, вы вызываете пользовательский код, тогда как команда echo может иметь больший приоритет и т. Д. И т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...