Цикл өзгермейтін кодты оптимизациялау: компилятордың цикл ішіндегі өзгермейтін кодты сыртқа шығару арқылы бағдарламаның тиімділігін арттыру әдісі. SEO үшін жақсартылған.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Компиляторды оңтайландыру түрі
Type of compiler optimization
Компьютерлік бағдарламалауда циклдік өзгермейтін код – бұл бағдарламаның мағынасын өзгертпей, циклдің ішіндегі бөлігінен сыртқа жылжытуға болатын операторлар немесе өрнектер (бұйрық беру тілінде). Циклдік өзгермейтін кодты жылжыту (сонымен қатар көтеру немесе скалярлық жылжыту деп те аталады) – бұл қозғалысты автоматты түрде жүзеге асыратын компилятордың оңтайландыруы.
In computer programming, loop invariant code consists of statements or expressions (in an imperative programming language) that can be moved outside the body of a loop without affecting the semantics of the program. Loop invariant code motion (also called hoisting or scalar promotion) is a compiler optimization that performs this movement automatically.
Өзгермейтін кодты анықтау
Көбінесе, қолжетімді анықтамалар талдауы бір мәлімдеме немесе өрнектің цикл инварианты екенін анықтау үшін қолданылады. Мысалы, егер қандай да бір қарапайым өрнектің операндарына қатысты барлық қолжетімді анықтамалар циклдің сыртында болса, онда сол өрнекті циклден шығаруға болады. Дерек ағынының тәуелділік талдауын пайдаланатын соңғы жұмыстар инвариант командаларды ғана емес, сонымен қатар ішкі цикл сияқты үлкен код фрагменттерін анықтауға мүмкіндік береді. Бұл талдау, сондай-ақ, кез келген дәрежедегі квази-инварианттарды анықтайды, яғни цикл денесінің белгілі бір саны ітерілгеннен кейін инвариант болатын командаларды немесе код фрагменттерін анықтайды.
Usually, a reaching definitions analysis is used to detect whether a statement or expression is loop invariant. For example, if all reaching definitions for the operands of some simple expression are outside of the loop, the expression can be moved out of the loop. Recent work using data flow dependence analysis allows to detect not only invariant commands but larger code fragments such as an inner loop. The analysis also detects quasi invariants of arbitrary degrees, that is commands or code fragments that become invariant after a fixed number of iterations of the loop body.
Артықшылықтары
Шығарылған циклдық инвариант код жиірек орындалмайды, бұл орындау жылдамдығын арттырады. Бұл түрлендірудің тағы бір салдары – тұрақтыларды тіркеулерде сақтауға мүмкіндік туады, соның салдарынан әр итерацияда адресті есептеу және жадқа (немесе кэш жолына) кіру қажеттілігі болмайды. Дегенмен, егер тым көп айнымалы құрылса, тіркеулерге күшті жүктеме түседі, әсіресе 32 биттік x86 сияқты тіркеулердің аз саны бар процессорларда. Егер компилятор тіркеулердің таусылып қалса, кейбір айнымалылар жадқа шығарылады. Мұны болдырмау үшін кері оңтайландыру, яғни қайта құру (рематериализация) қолданылуы мүмкін.
Loop invariant code which has been hoisted out of a loop is executed less often, providing a speedup. Another effect of this transformation is allowing constants to be stored in registers and not having to calculate the address and access the memory (or cache line) at each iteration. However, if too many variables are created, there will be high register pressure, especially on processors with few registers, like the 32 bit x86. If the compiler runs out of registers, some variables will be spilled. To counteract this, the inverse optimization can be performed, rematerialization.