Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тест на производительность, результаты 
:(
    Опции темы
Coder
Дата 3.4.2005, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



Решил протестировать C++, Pascal и Asm на производительность кода. Вот три исходника:

Код

.486
.model flat,stdcall
option casemap:none
includelib c:\myasm\lib\kernel32.lib
includelib c:\myasm\lib\user32.lib
include c:\myasm\include\kernel32.inc
include c:\myasm\include\user32.inc
num_size equ 10
.data
stdout dd ?
buf db num_size dup(?)
frt db "%d",0
caret db 13,10
cWritten dd 0
.code
start:
invoke GetStdHandle,-11
mov stdout,eax
mov ecx,100000
nxt:
    push ecx
    invoke wsprintf, addr buf, addr frt, ecx
    invoke WriteConsoleA, stdout, addr buf, sizeof buf, addr cWritten, 0
    invoke WriteConsoleA, stdout, addr caret, 2, addr cWritten, 0
    pop ecx
loop nxt
invoke ExitProcess, 0
end start


Код

var
i : longint;
begin
  for i:=100000 downto 1 do
   writeln(i);
end.


Код

#include <stdio.h>

void main(){
  long i;
  for (i=100000;i!=1;i--)
    printf("%ld\n",i);
}


Так вот, получились интересные результаты, программа на C++ и Pascale выполняются за ~14 сек., а на Asm за (!) ~46 сек.
Почему такая ерунда происходит? я думал, что все должно быть наоборот - ведь на Асме идет прямое обраещение к процессору... где же быстродействие ассемблера?

P.S. используемые компиляторы:
С++ - Turbo C++ 3.0
Pascal - Borland Pascal 7.0
Asm - MASM32 7.0

P.S.2. еще мое наблюдение, при выполнение кода Паскаля и С загружен процесс ntvdm.exe, а при выполнении кода Asm загружен процесс csrss.exe. почему эти программы выполняются в разными процессами?
PM MAIL   Вверх
cardinal
Дата 3.4.2005, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(Coder @ 2.4.2005, 23:34)
Почему такая ерунда происходит?

Потому что, твой компилятор сделал все лучше, чем то, что сделал ты сам (то, что сделано на asm'е).
Цитата(Coder @ 2.4.2005, 23:34)
где же быстродействие ассемблера?

В более хитром подходе smile

Любой компилятор (не asm) перед тем как сделать exe'шник как бы создает asm, а потом уже делает понятный для процессора файл с коммандами. Некоторые компиляторы позволяют посмотреть на то, что они делают сами (создают asm листинги) и ты можешь подумать над тем, а нельзя ли сделать это лучше самому.
В твоем примере последнее не получилось smile

Рассказал все своими словами, может не очень получилось smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
S.A.P.
Дата 3.4.2005, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Могу предположить, что из за того, что Pascal и C++ у тебя досовские, а приложение на Асме - виндовое. Консоль - это не Dos приложение. Dos овские компилеры, например, вместо вызова wsprintf используют свой код и так, возможно будет быстрее, потому - что в асме ты принудительно обращаешься к функции в DLL, а Dos компилер может все это оптимизировать в инлайн функцию. Да и WriteConsoleA DOS компилер не использует, ее может использовать процесс, который эмулирует Dos приложение. Но это только ИМХО.

Это сообщение отредактировал(а) Perchilla - 3.4.2005, 03:46
PM MAIL   Вверх
Coder
Дата 3.4.2005, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



cardinal, покажи более хитрый подход!
PM MAIL   Вверх
Chingachguk
Дата 3.4.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
ведь на Асме идет прямое обраещение к процессору...


Где ты увидел прямое обращение к процессору ? wsprintf - это API, так что это просто вызовы Win. К тому же у тебя два вызова WriteConsoleA в асме, а в СИ и Паскале наверняка один. Про то, что СИ и Пас под дос, а асм - для win, уже сказали.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
cardinal
Дата 3.4.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(Coder @ 3.4.2005, 05:52)
cardinal, покажи более хитрый подход!

а ты поставь себе MS VC++ и эксперементируй там. Создашь listing и исходя из него будешь оптимизировать (поправляя то, что стоит в _asm{} smile). А profile тебе скажет, что лучше.
А во-вторых попробуй вместо loop сделать просто dec. Помоему когда я экспериментировал у меня так быстрее получалось.
Когда добьешься оптимального результата можешь его использовать в другом C/C++ компиляторе (если он конечно _asm делать позволяет)...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
oleg1973
Дата 3.4.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



давайте тестить printf из crtdll.dll


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Coder
Дата 5.4.2005, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: нет
Всего: 11



пользуясь всем вышепосоветованным решил проверить просто скорость прогонки циклов на этих языках (без вызова каких либо операторов, функций)
но брал уже цикл от 2`000`000`000 до 0.

Код

.486
.model flat,stdcall
option casemap:none
includelib c:\myasm\lib\kernel32.lib
include c:\myasm\include\kernel32.inc
.code
start:
mov eax,2000000000
nxt:
dec eax
cmp eax,0
jnz nxt
invoke ExitProcess, 0
end start

Код

var
i : longint;
begin
  for i:=200000000 downto 1 do ;
end.

Код

#include <stdio.h>
void main(){
  long i;
  for (i=2000000000;i!=1;i--);
}


Вот такие результаты:
Asm - ~5 сек
Pascal - ~3 сек !!!
C++ - ~16.5 сек

ну вроде все убрал остались гольные цифры и оказывается компилятор паскаля с ними справляется лучше...

PM MAIL   Вверх
S.A.P.
Дата 5.4.2005, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Coder во первых убери строчку cmp eax,0. Инструкция DEC сама выставляет флаг признака нуля.
Во вторых сравни количество нулей у числа в C++ и Pascal и ASM smile
В третьих в С++ попробуй и такой цикл замутить
Код

long i = 2000000000;
while (i--){};

В четвертых посмотри в опциях компилатора всякие оптимизации по скорости.

PM MAIL   Вверх
S.A.P.
Дата 5.4.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Вот как оптимизирует цикл Visual C++
Код

    while (i--)
    {
        _asm NOP;
00401005 90               nop              
00401006 48               dec         eax  
00401007 75 FC          jne         main+5 (401005h) 
    };


Разницы с ассемблером нет. А если убрать строчку _asm NOP, то вобще весь цикл вырезает. Посмотрим, как с этим Борланд справится.

Уже на глаз можно прикинуть, что Pascal обделается в этом тесте.
PM MAIL   Вверх
Girder
Дата 5.4.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Цитата(Perchilla @ 5.4.2005, 11:10)
Уже на глаз можно прикинуть, что Pascal обделается в этом тесте.

smile Уже на глаз... видно обратное smile особенно для старых компьютеров smile

Код:
Код

for i:=200000000 downto 1 do;
будет преобразован в вот ентот код:
Код
mov eax,0f4143e00h
Go:
inc eax
jnz Go



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
S.A.P.
Дата 5.4.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Цитата(Girder @ 5.4.2005, 15:19)
Уже на глаз... видно обратное

чем этот код
Код

Go:
inc eax
jnz Go

будет быстрее этого
Код

Go:
dec  eax  
jne Go

smile
Тем более Visual C++ вобще пустые циклы вырезает.
PM MAIL   Вверх
Girder
Дата 5.4.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Вот ентот код (особенно на старых компьютерах) будет медленнее:
Код
nop
dfkj:
nop
dec eax
jne sdfkj
Например у меня на p233MMX твой код медленне в 2 раза. У Coder явно тоже не современный комп smile

PS: И не надо мне советовать комп поменять... я его мож подарить хочу smile Вот только не берет ни кто smile

Это сообщение отредактировал(а) Girder - 5.4.2005, 15:56


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
S.A.P.
Дата 5.4.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Щас по другому проверим smile . Обратный цикл, с шагом 3, а через раз прибавлять по единичке.

Претендент:
Код

long i = 2000000000;
bool a = true;
while (i+=(a^=1)-3){};

Добавлено @ 16:04
Цитата(Girder @ 5.4.2005, 15:49)
Вот ентот код (особенно на старых компьютерах) будет медленнее:
только без NOP. Я его поставил, чтобы компилер цикл пустой не вырезал.

Добавлено @ 16:05
Цитата(Girder @ 5.4.2005, 15:49)
И не надо мне советовать комп поменять... я его мож подарить хочу smile Вот только не берет ни кто smile
у меня P166 дома пылиться smile .


Это сообщение отредактировал(а) Perchilla - 5.4.2005, 16:02
PM MAIL   Вверх
Girder
Дата 5.4.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Чего и то у тебя было 200000000 стало 2000000000

Тестируй:
Код
...
var i,j:Longint;
begin
 i:=200000000; //или 2000000000
 j:=3;
 repeat
  i:=i-j;
  j:=j xor 1;
 until (i<0);
...
PS: А мне лень... тестировать smile


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.