Автор |
Съобщение |
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Оптимизация на програма
Значи имам един голям фрагмент от от примерния вид: if(val == aa) { .... } else if(val == bb) { ... } else if(val == cc) { ... } else if(val == dd) { ... } ..... ..... else { ... }
Сравненията са с непоследователни стойности. Опитвам се да измисля начин за оптимизация на тоя пасаж за по-бързо изпълнение. Вече съм вкарал предварителни проверки дали изобщо да идвам на него, и съм подредил иф-вете според вероятността да се случат.
Някакви нестандартни идеи как още да го забързам?
PS. switch() върши точно същото, така че не е оптимизация
_________________ 'просто' е технически синоним на 'красиво'
|
Нед Юли 19, 2020 9:28 am |
|
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 3:11 pm Мнения: 3742 Местоположение: София
|
Re: Оптимизация на програма
Ако компилаторът е умен, switch case е най-бързото, ифове няма, само табличен jump. Ако кейсовете са малко разхвърляни, това ще работи добре, въпреки, чи ще има много елементи, които сочат към default. Aко има огромни разлики, компилаторът генерира сортирана таблица и се ползва бинарно търсене. Дали ще е по-ефективно, зависи от броя на елементите. И в двата случая губиш от това, че не ползваш, че ти е известна вероятността за влизане в определен кейс. Опитай се да се сшретнеш някакъв реалистичен тест и виж кое е по-добро.
|
Нед Юли 19, 2020 9:51 am |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Оптимизация на програма
Вече го пробвах със switch() под GCC в прозорците, и под XC32 (с -О3 оптимизация). Разликата в изпълнението е 0.059%
_________________ 'просто' е технически синоним на 'красиво'
|
Нед Юли 19, 2020 10:08 am |
|
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 8:39 pm Мнения: 1971
|
Re: Оптимизация на програма
Таблица или мащабиране + таблица? Тогава няма да имаш никакви проверки
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!
|
Нед Юли 19, 2020 11:29 am |
|
|
Jack
Ранг: Ориентиран
Регистриран на: Вто Май 07, 2019 8:16 pm Мнения: 278
|
Re: Оптимизация на програма
От чисто любопитство - две или повече различни условия 'aa' 'bb' в условната част могат ли да извикат един и същ код в частта с къдравите скоби ?
if(aa) then {ala bala} if(bb) then {portokala} if(cc) then {ala bala}
...или всяко условие извиква уникален код.
if(aa) then {ala} if(bb) then {bala} if(cc) then {portokala}
|
Нед Юли 19, 2020 1:26 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Оптимизация на програма
_________________ 'просто' е технически синоним на 'красиво'
|
Нед Юли 19, 2020 1:31 pm |
|
|
Bai Ui
Ранг: Форумен бог
Регистриран на: Вто Ное 06, 2018 4:18 pm Мнения: 1220
|
Re: Оптимизация на програма
switch/case e по-бърз за изпълнение от if стейтмънта, разбъркай порядъка на if цикъла като започнеш от условието с най малка вероятност и завършиш с условието с най-голяма и провери отново производителността. Няма универсална рецепта за оптимизация, всичко е според кода, и понеже нямам код, няма как да ти дам съвет.
|
Нед Юли 19, 2020 2:20 pm |
|
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 11:48 am Мнения: 4715
|
Re: Оптимизация на програма
той така или иначе GCC ще оптимизира switch/case/if/else
_________________ main[-1u]={1};
|
Нед Юли 19, 2020 5:57 pm |
|
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 11:02 am Мнения: 8891 Местоположение: Разград
|
Re: Оптимизация на програма
Сега младоците ги учат, че в таква ситуация се взема по-мощен процесор. Иначе аз го виждам условията да се сведат до индекс и после с този индекс, таблично да си вика съответната функция. Което пак може да се окаже че отнема повече време в крайна сметка.
|
Нед Юли 19, 2020 6:43 pm |
|
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 10:31 pm Мнения: 9645
|
Re: Оптимизация на програма
в общия случай, компилатора (gcc/clang) ще генерира еднакъв код и за двата случая с нещо по-голямо от -О2 нямам наблюдения за мокрочипското компилатор.
|
Нед Юли 19, 2020 7:08 pm |
|
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 8:14 am Мнения: 4616 Местоположение: Новата земя на племето Мутум'ба
|
Re: Оптимизация на програма
Да, и мен ме изненада но е факт. Пробвах така и се оказа с почти 10% по-бавно. Явно индексирането си има цена...
_________________ 'просто' е технически синоним на 'красиво'
|
Нед Юли 19, 2020 7:16 pm |
|
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 11:02 am Мнения: 8891 Местоположение: Разград
|
Re: Оптимизация на програма
Ами значи нещо концепцията куца Аз вече втора седмица се мъча да измисля нещо да стане ултра елегантно и не ми се получава.
|
Нед Юли 19, 2020 8:31 pm |
|
|
TheHungry
Ранг: Почетен член
Регистриран на: Съб Сеп 03, 2005 10:31 am Мнения: 746 Местоположение: Пловдив
|
Re: Оптимизация на програма
Таблица със всички стойности с които сравняваш свързана с Call-ове към съответното действие , със сигурност победи винаги ще се изпълнява проверката за константно време като цяло при различни стойности винаги времето за изпълнение ще е едно и също .Другия вариант е да го напишеш на VHDL или Verilog ( шегичка).
_________________ "I really do like SOLDERING as my programming language." Bob Pease
|
Пон Юли 20, 2020 3:19 pm |
|
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 11:02 am Мнения: 8891 Местоположение: Разград
|
Re: Оптимизация на програма
То така ама ако сравняваш една и съща променлива. Бабане така го е написал, че сякаш е една и съща. Тогава въпросната променлива се прави като индекс на таблица с call-ове. Ще трябва обаче тези които няма как да се появят да присъстват в таблицата по някакъв начин - малко повече код. И щом компилатора не иска да го сдъвче по този начин - инлайн асм...
|
Пон Юли 20, 2020 3:28 pm |
|
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 8:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
Re: Оптимизация на програма
когато е switch - компилатора прави jump по таблица (не е call) а когато е с таблица прави call (със съответния овърхед)
|
Пон Юли 20, 2020 4:10 pm |
|
|