История изменений
Исправление wandrien, (текущая версия) :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z) of
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
end
Будет превращен во что-то типа такого:
int f1(int x, y, z) of
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid y");
label panic_z:
panic(__FILE__, __LINE__, "invalid z");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
end
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.
Исправление wandrien, :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z)
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
Будет превращен во что-то типа такого:
int f1(int x, y, z)
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid y");
label panic_z:
panic(__FILE__, __LINE__, "invalid z");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.
Исправление wandrien, :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z)
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
Будет превращен во что-то типа такого:
int f1(int x, y, z)
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid y");
label panic_z:
panic(__FILE__, __LINE__, "invalid z");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.
Исправление wandrien, :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z)
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
Будет превращен во что-то типа такого:
int f1(int x, y, z)
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid y");
label panic_z:
panic(__FILE__, __LINE__, "invalid z");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.
Исправление wandrien, :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются холодными, а какие горячими.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z)
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
Будет превращен во что-то типа такого:
int f1(int x, y, z)
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid y");
label panic_z:
panic(__FILE__, __LINE__, "invalid z");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.
Исходная версия wandrien, :
Что касается оптимизации кода, то далее в моих планах:
- Добавить
likely()
,unlikely()
, чтобы указывать компилятору, какие ветви являются холодными, а какие горячими.
if likely(x < y) then
/* горячая ветвь */
pass;
else
/* холодная ветвь */
pass;
end:if
-
Если
likely()
,unlikely()
не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной какattribute(cold)
, то такая ветвь является холодной. -
Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.
Код наподобие такого:
int f1(int x, y, z)
when x == 0:
panic(__FILE__, __LINE__, "invalid x");
when y == 0:
panic(__FILE__, __LINE__, "invalid x");
when z == 0:
panic(__FILE__, __LINE__, "invalid x");
int a = f2(x, y, z);
when a == 0:
panic(__FILE__, __LINE__, "invalid a");
return a;
Будет превращен во что-то типа такого:
int f1(int x, y, z)
when x == 0: goto panic_x;
when y == 0: goto panic_y;
when z == 0: goto panic_z;
int a = f2(x, y, z);
when a == 0: goto panic_a;
return a;
label panic_x:
panic(__FILE__, __LINE__, "invalid x");
label panic_y:
panic(__FILE__, __LINE__, "invalid x");
label panic_z:
panic(__FILE__, __LINE__, "invalid x");
label panic_a:
panic(__FILE__, __LINE__, "invalid a");
(Так как компилятор знает, что panic()
не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)
- Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.