CLD STD - очень сильно замедляют работу функции

Тема в разделе "WASM.BEGINNERS", создана пользователем magnn, 30 окт 2005.

  1. magnn

    magnn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2005
    Сообщения:
    1
    Адрес:
    Нижний Новгород
    Написал функцию по работе со строками. Использовал свое индексирование для доступа к строкам. Решил перейти на LODSB STOSB - потребовались команды CLD и STD. Так вот использование этих команд сильно замедлило работу функции. Я то думал, что у меня быстрее будет работать, вроде LODSB STOSB сами индексы крутят, а тут такая засада



    было типа так:



    mov ecx,10



    // начало цикла

    mov al,[ebx]

    dec ecx

    ...

    ...

    // конец цикла



    сделал:



    pushf

    std

    mov si,10

    // начало цикла

    lodsb

    ...

    ...

    // конец цикла

    popf
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    и это работает?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Imho - опечатка, надо читать mov cx,10.



    magnn

    Afaik замедление из-за lodsb/stosb, они всегда были медленнее, но занимают меньше места.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    magnn

    > "быстрее будет работать, вроде LODSB STOSB сами индексы крутят"

    Распространенное заблуждение. Все одиночные строковые операции без REP работают медленнее простых mov. А циклические операции с REP имеют достаточно большое время инициализации (оверхед), поэтому их имеет смысл использовать только при большом числе повторений иначе проигрыш м.б.еще больше. Ну и самое интересное, что REP операции работают вперед (CLD) значительно быстрее, чем назад (STD).

    Что касается самих CLD\STD, то они тоже не относятся к разряду быстрых, т.к. частично изменяют eflags и имеют ложную зависимость по флагам от пред.операций. В атлонах их латентность 1-2 тика, в P6 до 4-х, а вот в P4 если верить А.Фогу (т.к. сами интелы об этом умалчивают) латентность CLD\STD составляет несколько десятков тиков (?!) Поэтому сами по себе они могут заметно тормозить только на P4.

    Ну а в твоем случае, переход на lodsb да еще с STD никакого смысла в плане быстродействия не имеет - только доп.тормоза ;)