ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

Создание таблицы переходов


Если значения ветвей выбора представляют собой арифметическую прогрессию, то можно сформировать таблицу переходов – массив, проиндексированный case-значениями и содержащий указатели на соответствующие им case-обработчики. В этом случае, сколько бы оператор switch ни содержал ветвей, – один или миллион – он выполняется за одну итерацию. Красота!

Создавать таблицы переходов умеют все три рассматриваемых компилятора, и следующий пример успешно оптимизирует каждый из них.

switch (a)

{

case 1 : …;

case 2  :…;

case 3  :…;

case 4  :…;

case 5 : …;

case 6  :…;

case 7  :…;

case 8  :…;

case 9  :…;



case 10 :…;

case 11 :…;

}

Однако WATCOM плохо справляется с переупорядоченной прогрессией и совсем не справляется с несколькими независимыми прогрессиями. Компиляторы Microsoft Visual C++ и Borland C++ успешно оптимизируют следующий пример, а WATCOM создаст обычное несбалансированное логическое дерево, в худшем случае выполняющееся за одиннадцать итераций, что на порядок хуже, чем у конкурентов.

switch (a)

{

case 11 : …;

case 2  : …;

case 13 : …;

case 4  : …;

case 15 : …;

case 6  : …;

case 17 : …;

case 8  : …;

case 19 : …;

case 10 : …;

case 21 : …;

}



Содержание раздела