pop и je что работать быстрей?

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 22 дек 2008.

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Вот задумался,
    у меня есть три переменные, занесённые в стек.
    DD - все переменные двойные слова
    (Кстати, поясните..почему на процессоре доспуп к двойному слову быстрей чем к байту... что физически в проце происходит?)

    Код (Text):
    1. push a1
    2. push a2
    3. push a3
    мне нужно сравнить их с эталонными значениями в b1, b2, b3. И при неправильности хотябы одной из них, перейти на метку exit
    Как это лучше сделать?.так?
    Код (Text):
    1. pop ebx
    2. cmp ebx, b1
    3. jnz exit
    4.  
    5.  
    6. pop ebx
    7. cmp ebx, b2
    8. jnz exit
    9.  
    10.  
    11. pop ebx
    12. cmp ebx, b3
    13. jnz exit
    или так?

    Код (Text):
    1. обнулить флаг ZF     ; Не помню сейчас команды
    2. pop ebx
    3. cmp ebx, b3
    4. pop ebx
    5. cmp ebx, b2
    6. pop ebx
    7. cmp ebx, b1
    8. jnz exit
    И желательно пояснить)) почему...
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    второй код делает не то же самое, что первый (даже если учесть, что ты опечатался, три раза написав сравнение с b3)
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Понятно) теперь вижу... логика у меня тупая была, когда это писал)..
    тогда такой вопрос..
    как ускорить это?
    Код (Text):
    1. pop ebx
    2. cmp ebx, b1
    3. jnz exit
    4.  
    5.  
    6. pop ebx
    7. cmp ebx, b2
    8. jnz exit
    9.  
    10.  
    11. pop ebx
    12. cmp ebx, b3
    13. jnz exit
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    извиняюсь за флуд, но что ты такое кодишь, что оно так критически относится к скорости??? Перехватчик баллистических ракет? или брут SHA-512?
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    лучше прямо к памяти обращаться через [esp+...], без pop'ов.
     
  6. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Тут возник ещё вопрос.
    если оперировать с строками , где для каждого символа выделен один байт. То такие функции, как SCAS и CMPS.. Будут работать медленнее чем если бы для каждого символа выделялось бы по 4 байта??
     
  7. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    MSoft
    хочу своё приложении сделать максимально качественным.
    кстати, шифрование и расшифровка данных, в нём тоже присутствует
     
  8. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    надеюсь ты не забываешь главный закон оптимизации: "преждевремменая оптимизация - злейшее из всех зол" (с) Кнут
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    совсем-совсем-совсем круто, оптимально и идеально верно не бывает)
     
  10. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    meduza
    Приложение обрабатывает достаточно много текста. И выделяет для одного символа, всего один байт.. Вот и волнуюсь, что может стоило работать с DD, а то если я ещё немножко напишу подобного кода, где всё будет рассчитано на байты, то изменить потом что-то будет ОЧЕНЬ сложно, (проще будет код сначала писать).
    Вот и пытаюсь сейчас найти ошибки , чтоб позже было меньше проблем
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    если моя память мне ни с кем не изменяет, тут уже обсуждалась оптимизация и говорилось, что cmp/add edi,x будет работать быстрее, чем scas (или нет?)
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    stellaco
    Слышал звон, да не знаешь где он ? На каком таком "процессоре" ? Для всей линейки P6 (PIII,PM,Core) - без разницы, а для P4 и AMД действительно, латентность mov r,m для 8\16 битных операндов на 1 такт больше, чем 32-битных. Связано это с тем, что в P4 и АМД регистры al\ax являются частью общего eax, поэтому при загрузке 8\16 бит нужно объединить их со старшими битами регистра eax. НО, во-первых, латентность mov r,m и так составляет 3 такта, поэтому отн.разница 4/3 - это не так много. Во-вторых, в потоке команд, особенно в циклах, важна не столько латентность, сколько темп (throughput) выполнения операций, а все mov r,m конвееризованы (независимо от размера операнда) и могут выполняться в P4 в каждом такте, а в АМД аж по две за такт. Поэтому на практике разница между загрузкой байта и дворда может проявиться только при ловле блох на цпочках зависимых команд, а уж никак не на сканировании символов строк

    Соотв-но, выделять под символы строк по дворду - это глупость, т.к. на мувах практически ничего не выиграешь, а за счет увеличения нагрузки на память и кэш еще и проиграть можно. Тем более, что для поиска символов и подстрок существуют оптимизированные алгоритмы от элементарных разворотов цикла, векторизации поиска на РОН или MMX (см.пример векторизации strlen), до наворотов типа быстрого поиска а ля Бойер-Мур
     
  13. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    leo
    Спасибо за пояснение :)