Я тут учу ассемблер, и решил полюбоватся насколько он быстрее работает чем моя до этого любимая Java, и решил устроить гонки в виде итерации, но был очень удивлен когда вышло что оба кода, на MASM-е и на Java выполняются (практически) одинаковое кол-во времени (и в том и в другом случае примерно 4 секунды)! Я не понял, либо я гдето неправильно написал код, либо Java так хорошо оптимизирована при работе с итерациями (чёт я сомневаюсь..). Мне очень интересно, у кого либо есть идеи что здесь не так? --MASM32-- Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib .DATA sMesTitle db "Title", 0 sEnd db "Done!", 0 sStarting db "Starting..", 0 x dword 0 .DATA? sbBuffer db 15 dup(?) .CODE start: invoke MessageBox, NULL, offset sStarting, addr sMesTitle, MB_OK ;обьявляем о начале старта mov ecx, 0FFFFFFFFh ;ставим самое длинное значение: 2147483647 которое почемуто в тоже время -1 start_loop2: dec ecx mov x, ecx cmp ecx, 0 jl start_loop2 invoke dwtoa, x, offset sbBuffer ;записываем значение x в строку ;выводим доказательство что действительно было сделано столько-то итераций invoke MessageBox, NULL, offset sbBuffer, offset sEnd, MB_OK invoke ExitProcess, NULL --Java-- Код (Text): public static void main( String[] args ) { System.out.println( "Starting.." ); int x = 0; for( int i=0; i<2147483647; i++ ) { x = i; } System.out.println( "Done! " + x ); }
Вместо: Код (Text): CMP ECX, 0 JL start_loop2 Надо: Код (Text): JNZ start_loop2 Кроме того, сравнение на ноль быстрее делать командой TEST регистра с самим собой а затем применять JZ/JNZ инструкцию. В твоём случае DEC ECX установит флаги, а команда MOV флагов не меняет. Поэтому CMP здесь лишняя инструкция.
Поставил вместо двух строк: Код (Text): JNZ start_loop2 но так работает еще медленнее, наверное стоит подумать писать драйвера на жабе )
все равно скорость хуже чем первый случай (не 4 а почти 8 секунд), наверное я чтото упускаю из вида... Мда.. разобратся я сам (на этой стадии) не смогу, думаю со временем смогу оптимизировать код, ведь, на жабе код не выполняет меньше действий, так что все вроде честно, но почему же работает практически одинаково..
афффигеть.... мне бы и в голову не пришло!!! Я так и думал что я гдето допускаю ошибку! спасибо! Теперь с чистой совестью буду учить дальше ассемблер зная что он всетаки рулит в том что касается скорости!