|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sashka Yackubtchick 2:5054/29.54 13 Nov 2001 23:00:03 To : Egor Alexeev Subject : Case -------------------------------------------------------------------------------- 12 Nov 01 21:03, Egor Alexeev писАл(а) к All: EA> 1)Сделать просто с помощью оператора Case. Hо, так как параметров выбора EA> достаточно много(256), то по скорости он меня не очень EA> устраивает. 2)Создать массив(A[0..255]) процедурного типа и, обращаясь к EA> его соответствующему элементу выполнять ту или иную процедуру(A[m]). Этот EA> способ плох тем, что тратится большое количество времени на постоянный EA> вызов процедур(причем с FAR моделью вызова). EA> Может есть какой нибудь способ у которого не будет ни недостатка перебора EA> Case'а, ни вызова процедур? Hе знаю насколько это поможет, мой основной язык asm x86 для flat модели. Очень часто случаются похожие ситуации когда кейсы можно представить или получить в виде упорядоченого непрерывного массива и тогда их можно использовать как индексы к таблице переходов, причём при подобной технике нет разницы насколько много кейсов(единственное условие чтобы их можно было представить как непрерываные значения) - правильный обработчик будет вызван за одно и тоже время. Причём несмотря на создание таблицы переходов не только растёт скорость но и уменьшается расход памяти и размер исполнительного модуля поскольку на реализацию стандартной case обработки уходит больше байтов на каждый "служебный" код нежели на один указатель в секции данных. Схема примерно такая 1. В секции данных распологаются адреса обработчиков разных кейсов по мере роста индексов кейсов. hCase dd @case1 ;массив данных DWORD -32х разрядных указателей. dd @case2 dd @case3 .... dd @case256 2. В секции кода пришедшее значение кейса используется как индекс элемента в таблице-массиве hCase и делается переход по этому элементу например он пришел в wParam mov eax,wParam mov eax,[eax*4][offset hCase] jmp eax .... @case1: здесь код для case1 ... jmp @endcase @case2: здесь код для case2 ... jmp @endcase @case3: .... jmp @endcase .... .... @case256: ... @endcase В независимости от колличества кейсов и номера нужный обработчик будет найден за 5 тактов процессора P5 и выше. Пока! Sashka, The Svin. --- GoldED/W32 3.00.Beta1+ * Origin: Svin, Perm, Russia (2:5054/29.54) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33843bf19ca5.html, оценка из 5, голосов 10
|