У меня есть следующий код для рисования круга в данном буфере:
void drawcircle(int x, int y, int radius, void* buffer, int width, int height)
{
int radiusSq = radius * radius;
for (int yy = -radius; yy <= radius; ++yy)
{
for (int xx = -radius; xx <= radius; ++xx)
{
if (xx * xx + yy * yy < radiusSq + radius)
{
//This if-statement destroys performance in Os and O0.
if (x + xx >= 0 && y + yy >= 0 && x + xx <= width && y + yy <= height)
{
set_pixel(x + xx, y + yy);
}
}
}
}
}
В Xcode флаги по умолчанию: -O0
для отладки -Os
для выпуска
При запуске кода выше для clang с -Os
или -O1`, функции требуется 6 с, чтобы нарисовать 100 000 кругов радиуса 100.
Если вместо этого я включу -O2
, она будет выполняться за 40 нс, а 29 нс сO3
. Это огромная разница.
Только для этой функции я хочу включить O2 или O3. Я столкнулся со следующим синтаксисом:
[[gnu::optimize(O2)]]
, [[gnu::optimize("O3")]]
, [[clang::optimize(optnone)]]
, __attribute((optimize(O3)))__
где-то.
Если я укажу что-либо, кроме optnone
атрибут optimize
игнорируется (O0
также игнорируется) ..
Любые идеи, как я могу сказать, чтобы оптимизировать эту функцию только с указанным уровнем?