Перейти к содержанию
    

Опримизация switch case

Собственно заинтересовал такой вопрос, навеянный темой в ветке gcc:

http://electronix.ru/forum/index.php?showt...=61802&st=0

 

Так получилось, что есть программа с 50ю кейсами, переменная от 1 до 50 и выбор соотв. кейса. Хотелось бы ускорить переход на каждый кейс, путем индексирования. Предложенный вариант с функциями и массивом их адресов особо не катит, т.к. нужна передача параметров и глобально задавать переменые - не вариант. Подход с метками считаю более лучшим, но как получить адрес метки, чтоб закинуть его потом в массив - без понятия.

Может есть какие мысли??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы ускорить переход на каждый кейс, путем индексирования.
ИАР достаточно умный компилятор, такую оптимизацию он делал автоматически еще лет 15 назад, посмотрите листинг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотелось бы ускорить переход на каждый кейс, путем индексирования.

...

Может есть какие мысли??

Мысли есть. А оно надо? В смысле из-за неоптимальности именно в этом месте что-то не работает?

И присоединюсь к Сергею: многие компиляторы это сами умеют. А если не умеет, или ему в этом конкретном случае что-то мешает, то и фиг с ним. Делать закат солнца вручную - такой моветон...

 

Подход с метками считаю более лучшим, но как получить адрес метки, чтоб закинуть его потом в массив - без понятия.

Переходите на GCC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно заинтересовал такой вопрос, навеянный темой в ветке gcc:

...

Может есть какие мысли??

А какая платформа у вас?

Если тот же MSP430, что в ссылке, так чем не устраивает _even_in_range_(range) ?

 

А если что другое, то в ИАРе делал такое:

__task void main(void)
  {
  StartUp_C();
  asm ("MOV.W   SP,&Task_InitSP");
  asm ("MAIN_CYCLE: ");
  for(;;)
    {
    Main_Services();
    .......
    }
  }

void Foo(unsigned int qwerty)
  {
  ........
  asm ("BR      #MAIN_CYCLE");
  }

Так что, со встроенным ассемблером что нить можно придумать, но для switch-а я это делать крайне не советую...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мысли есть. А оно надо? В смысле из-за неоптимальности именно в этом месте что-то не работает?

 

В смысле просто была мысль ускорить интерпретацию команд...

 

Да, забыл, платформа АРМ кортекс А9.

 

Переходите на GCC.

 

Нее, уж лучше вы к нам :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле просто была мысль ускорить интерпретацию команд...

Ну так гэцэцэшная фича с метками-указателями для этого и придумана.

 

Нее, уж лучше вы к нам :biggrin:

А я и там, и здесь. Что удобнее, то и использую. А вы можете продолжать колоться, плакать и кушать свой кактус :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...