Усунення спільних підвиразів
Усунення спільних підвиразів (англ. common subexpression elimination, CSE) це оптимізація компілятора, за якої шукаються примірники тотожних виразів (тобто таких, що мають однакове значення), і приймається рішення, чи варто замінити їх однією змінною, що містить обчислене значення. ПрикладТакий код: a = b * c + g; d = b * c * d; може бути доцільно переробити так: tmp = b * c; a = tmp + g; d = tmp * d; «Доцільно» означає, що отриманий новий код буде виконуватись швидше. ОсновиМожливість УСП базується на дослідженні доступних виразів, тобто таких, що не потребують переобчислення (аналіз потоку даних). Вираз
Дослідження вартість-вигода, виконуване оптимізатором, обчислить, чи вартість зберігання Розробники компіляторів розрізняють два види УСП:
ВигодиОптимізація УСП широко використовується, бо вигоди від неї досить значні. В простих виразах на зразок прикладу вище програміст може під час написання коду вручну усунути подвійні вирази. Найкраще джерело УСП — це проміжні кодові послідовності створені компілятором, такі як розрахунки індексації масивів, де розробник не може втрутитись вручну. В деяких випадках через особливості мови може утворюватися багато повторюваних виразів. Наприклад, макроси C, де розгортання макросів може мати наслідком багато спільних підвиразів не видимих в початковому коді. Компілятори мають бути розважливими щодо кількості тимчасових об'єктів для утримання значень. Надмірна кількість тимчасових значень спричиняє тиск на регістри з можливим наступним проливанням регістрів у пам'ять, що призведе до затримки більшої ніж потрібна для простого переобчислення арифметичного результату. Джерела
|