скорость Java vs Assembler

Тема в разделе "WASM.BEGINNERS", создана пользователем xlinuks, 13 авг 2006.

  1. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Я тут учу ассемблер, и решил полюбоватся насколько он быстрее работает чем моя до этого любимая Java, и решил устроить гонки в виде итерации, но был очень удивлен когда вышло что оба кода, на MASM-е и на Java выполняются (практически) одинаковое кол-во времени (и в том и в другом случае примерно 4 секунды)! Я не понял, либо я гдето неправильно написал код, либо Java так хорошо оптимизирована при работе с итерациями (чёт я сомневаюсь..). Мне очень интересно, у кого либо есть идеи что здесь не так?

    --MASM32--
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8.  
    9. includelib \masm32\lib\kernel32.lib
    10. includelib \masm32\lib\user32.lib
    11.  
    12. include \masm32\include\masm32.inc
    13. includelib \masm32\lib\masm32.lib
    14.  
    15. .DATA
    16. sMesTitle db "Title", 0
    17. sEnd db "Done!", 0
    18. sStarting db "Starting..", 0
    19. x dword 0
    20.  
    21. .DATA?
    22. sbBuffer db 15 dup(?)
    23.  
    24. .CODE
    25. start:
    26. invoke MessageBox, NULL, offset sStarting, addr sMesTitle, MB_OK ;обьявляем о начале старта
    27. mov ecx, 0FFFFFFFFh ;ставим самое длинное значение: 2147483647 которое почемуто в тоже время -1
    28.  
    29. start_loop2:
    30.     dec ecx
    31.     mov x, ecx
    32.     cmp ecx, 0
    33. jl start_loop2
    34.  
    35. invoke dwtoa, x, offset sbBuffer ;записываем значение x в строку
    36. ;выводим доказательство что действительно было сделано столько-то итераций
    37. invoke MessageBox, NULL, offset sbBuffer, offset sEnd, MB_OK
    38. invoke ExitProcess, NULL
    --Java--
    Код (Text):
    1. public static void main( String[] args ) {
    2.     System.out.println( "Starting.." );
    3.     int x = 0;
    4.     for( int i=0; i<2147483647; i++ ) {
    5.         x = i;
    6.     }
    7.     System.out.println( "Done! " + x );
    8. }
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вместо:
    Код (Text):
    1. CMP ECX, 0
    2. JL start_loop2
    Надо:
    Код (Text):
    1. JNZ start_loop2
    Кроме того, сравнение на ноль быстрее делать командой TEST регистра с самим собой а затем применять JZ/JNZ инструкцию. В твоём случае DEC ECX установит флаги, а команда MOV флагов не меняет. Поэтому CMP здесь лишняя инструкция.
     
  3. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Поставил вместо двух строк:
    Код (Text):
    1. JNZ start_loop2
    но так работает еще медленнее, наверное стоит подумать писать драйвера на жабе :))
     
  4. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    так будет честнее
    Код (Text):
    1. or ecx, -1
    2. @@:
    3. sub ecx, 1
    4. jnz @B
     
  5. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    xlinuks
    Ловкость рук... :)
    FFFFFFFF - это ровно в два раза больше чем 2147483647.
     
  6. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    все равно скорость хуже чем первый случай (не 4 а почти 8 секунд), наверное я чтото упускаю из вида... Мда.. разобратся я сам (на этой стадии) не смогу, думаю со временем смогу оптимизировать код, ведь, на жабе код не выполняет меньше действий, так что все вроде честно, но почему же работает практически одинаково..
     
  7. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    афффигеть.... мне бы и в голову не пришло!!!
    Я так и думал что я гдето допускаю ошибку! спасибо!
    Теперь с чистой совестью буду учить дальше ассемблер зная что он всетаки рулит в том что касается скорости!