![]() |
|
![]() ![]() ![]() |
|
Coder |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
Решил протестировать C++, Pascal и Asm на производительность кода. Вот три исходника:
Так вот, получились интересные результаты, программа на 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. почему эти программы выполняются в разными процессами? |
||||||
|
|||||||
cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
Потому что, твой компилятор сделал все лучше, чем то, что сделал ты сам (то, что сделано на asm'е).
В более хитром подходе ![]() Любой компилятор (не asm) перед тем как сделать exe'шник как бы создает asm, а потом уже делает понятный для процессора файл с коммандами. Некоторые компиляторы позволяют посмотреть на то, что они делают сами (создают asm листинги) и ты можешь подумать над тем, а нельзя ли сделать это лучше самому. В твоем примере последнее не получилось ![]() Рассказал все своими словами, может не очень получилось ![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Могу предположить, что из за того, что Pascal и C++ у тебя досовские, а приложение на Асме - виндовое. Консоль - это не Dos приложение. Dos овские компилеры, например, вместо вызова wsprintf используют свой код и так, возможно будет быстрее, потому - что в асме ты принудительно обращаешься к функции в DLL, а Dos компилер может все это оптимизировать в инлайн функцию. Да и WriteConsoleA DOS компилер не использует, ее может использовать процесс, который эмулирует Dos приложение. Но это только ИМХО.
Это сообщение отредактировал(а) Perchilla - 3.4.2005, 03:46 |
|||
|
||||
Coder |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
cardinal, покажи более хитрый подход!
|
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Где ты увидел прямое обращение к процессору ? wsprintf - это API, так что это просто вызовы Win. К тому же у тебя два вызова WriteConsoleA в асме, а в СИ и Паскале наверняка один. Про то, что СИ и Пас под дос, а асм - для win, уже сказали. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: нет Всего: 99 |
а ты поставь себе MS VC++ и эксперементируй там. Создашь listing и исходя из него будешь оптимизировать (поправляя то, что стоит в _asm{} ![]() А во-вторых попробуй вместо loop сделать просто dec. Помоему когда я экспериментировал у меня так быстрее получалось. Когда добьешься оптимального результата можешь его использовать в другом C/C++ компиляторе (если он конечно _asm делать позволяет)... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
давайте тестить printf из crtdll.dll
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Coder |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: нет Всего: 11 |
пользуясь всем вышепосоветованным решил проверить просто скорость прогонки циклов на этих языках (без вызова каких либо операторов, функций)
но брал уже цикл от 2`000`000`000 до 0.
Вот такие результаты: Asm - ~5 сек Pascal - ~3 сек !!! C++ - ~16.5 сек ну вроде все убрал остались гольные цифры и оказывается компилятор паскаля с ними справляется лучше... |
||||||
|
|||||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Coder во первых убери строчку cmp eax,0. Инструкция DEC сама выставляет флаг признака нуля.
Во вторых сравни количество нулей у числа в C++ и Pascal и ASM ![]() В третьих в С++ попробуй и такой цикл замутить
В четвертых посмотри в опциях компилатора всякие оптимизации по скорости. |
|||
|
||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Вот как оптимизирует цикл Visual C++
Разницы с ассемблером нет. А если убрать строчку _asm NOP, то вобще весь цикл вырезает. Посмотрим, как с этим Борланд справится. Уже на глаз можно прикинуть, что Pascal обделается в этом тесте. |
|||
|
||||
Girder |
|
||||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: нет Всего: 155 |
![]() ![]() ![]() Код:
-------------------- Как слышим, так и пишим. Истина где-то там... |
||||||
|
|||||||
S.A.P. |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
чем этот код
будет быстрее этого
![]() Тем более Visual C++ вобще пустые циклы вырезает. |
||||||
|
|||||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: нет Всего: 155 |
Вот ентот код (особенно на старых компьютерах) будет медленнее:
![]() PS: И не надо мне советовать комп поменять... я его мож подарить хочу ![]() ![]() Это сообщение отредактировал(а) Girder - 5.4.2005, 15:56 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
S.A.P. |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
Щас по другому проверим
![]() Претендент:
Добавлено @ 16:04
Добавлено @ 16:05
![]() Это сообщение отредактировал(а) Perchilla - 5.4.2005, 16:02 |
||||||
|
|||||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: нет Всего: 155 |
Чего и то у тебя было 200000000 стало 2000000000
Тестируй:
![]() -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |