Быстрое принадлежности числа диапазону.

Тема в разделе "WASM.A&O", создана пользователем Yashin_Sergey, 21 май 2008.

  1. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Добрый день.

    По сути вопрос в следующем, есть алгоритм: if(x >= a && x <= b) then { something.... }
    т.е. проверка принадлежности числа x диапазону (a - b).

    Существует ли оптимально быстрая реализация этого алгоритма ?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    для целых чисел в диапазоне a <= x < b
    if long((x-a)^(x-b)) < 0 then ... //< 0 - проверка знакового бита js
     
  3. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    Спасибо.
    Это будет быстрее чем cmp x,a ; cmp x,b ?
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    leo ^ -возведение в степень?
    Или это растягивается в цепочку
    Код (Text):
    1. mov eax,X
    2. mov ebx,X
    3. sub eax,a
    4. sub ebx,b
    5. xor eax,ebx
    6. js  label
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Э-э, как тебе сказать. При раздельной проверке используется два условных перехода, а при проверке несовпадения знака разностей - только один, т.к. вместо первого перехода используется XOR. Если процессор угадывает ("предсказывает") первый переход (taken\not-taken), то время выполнения будет примерно одинаковым (~2-3 такта). А если не угадывает, то возникат штраф на сброс конвеера ~10-30 тиков в зависимости от процессора
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Прикалываешься ? Это XOR в С\С++
     
  7. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    loe, если у вас есть минутка взгляните на статью http://smallcode.weblogs.us/2006/03/31/checking-if-a-point-belongs-to-the-interval/
    в ней предлагается некое решение вопроса оптимизации проверки принадлежности числа к диапазону, какие у вас мысли по этому поводу ? ваше решение будет работать быстрее чем предложенное в статье и для всех типов процессоров ?
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    leo
    Не прикалываюсь, просто очень давно прошу администрацию, что бы ввели теги и чтобы не было разночтений. Хотя приспособился вводить квадраты и кубы X² (X & # 178 ;) X³ (X & # 179 ;)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Yashin_Sergey
    Во-первых, в статье сравнение производится не с a и b, а c a и с=b-a, поэтому тут играет роль вычисляем ли мы разность b-a заранее или же непосредственно
    при сравнении. Во-вторых, оба варианта укладываются в 2-3 тика и поэтому для ловли блох в 1 тик нужно учитывать конкретную реализацию на асме или на HLL с учетом "окружения" (находятся ли числа в памяти или в регистрах, возможность распараллеливания с предыдущими инструкциями и т.д. и т.п.). Поэтому нужно либо рассматривать конкретную реализацию, либо проще\лучше "забить" на возможную разницу в 1 тик и использовать любой из вариантов по вкусу - в любом случае это будет в среднем заметно быстрее, чем вариант с двумя переходами или setcc\cmovcc

    PS: при ловле блох нужно иметь в виду, что современные процессоры
    1) разбивают сложные инструкции на микрооперации (мопы), например sub eax,[a] разбивается на mov tmp,[a] и sub eax,tmp, где tmp - временный регистр процессора
    2) могут выполнять несколько независимых мопов параллельно (в среднем 3, в пике до 6-9)
    Поэтому бОльшее кол-во простых инструкций могут выполняться с той же или даже более высокой скоростью, чем меньшее кол-во сложных
     
  10. Yashin_Sergey

    Yashin_Sergey Сергей

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    62
    Адрес:
    Москва
    leo

    Спасибо.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Yashin_Sergey
    Я сам использую вариант с XOR-ом, т.к. он легко расширяется на проверку попадания точки в прямоугольник или куб

    PS: Кстати оба варианта как-то "давным давно" здесь обсуждались и разницы в тиках выявлено не было (см.пост #16). (Эх, как молоды мы были и чушь прекрасную несли :lol: )
     
  12. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Помнится ещё TheSvin оптимизировал сие
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Еще помнится TheSvin-а более интересовала минимизация размера и "изящество" кода, нежели скорость "любой ценой" ;)
     
  14. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    посложнее, с нечёткой принадлежностью (a - eps)<= x <(b + eps), и двумя результатами:
    1. принадлежит/не принадлежит диапазону;
    2. нечётко принадлежит/не принадлежит диапазону.
     
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    leo
    //offtop
    ну, 2004 год не так уж и давно был - рано стареть - то!!!:))
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    UbIvItS
    //offtop
    Я не о возрасте, а об "ошибках трудных", "вопросах наивных", "азарте юном" и "спорах горячих" :lol:
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    leo
    //offtop
    не зря же пословица есть: "Век живи - век учись и............" - не будем о грустном:))))