Наивный способ:
- Код: Выделить всё
If r > 255 Then r = 255 Else If r < 0 Then r = 0
Я оптимизировал так:
- Код: Выделить всё
r = r * -(r > 0) + (r > 255) * (r - 255)
Стало интересно, можно ли оптимизировать сильнее?
If r > 255 Then r = 255 Else If r < 0 Then r = 0
r = r * -(r > 0) + (r > 255) * (r - 255)
Public Function ClampCond(ByVal r As Long) As Long
If r > 255 Then r = 255 Else If r < 0 Then r = 0
ClampCond = r
End Function
Public Function ClampExpr(ByVal r As Long) As Long
r = r * -(r > 0) + (r > 255) * (r - 255)
ClampExpr = r
End Function
Sub main()
MsgBox clamp(-1000, 0, 255)
End Sub
Function clamp(ByVal value As Long, min As Long, max As Long) As Long
clamp = IIf(value <= min, min, IIf(value > max, max, value))
End Function
ALX_2002 писал(а):Интересно как это в асме выглядит
VARIANT
VBAPI
rtcImmediateIf(
VARIANT *pvarExpr,
VARIANT *pvarTruePart,
VARIANT *pvarFalsePart
)
{
VARIANT ret;
HRESULT hr;
VARIANT_InitNull(&ret);
if(fBoolFromVar(pvarExpr) == 0)
{
hr = VariantCopyInd(&ret, pvarTruePart);
HrCheckAndRaiseError(hr);
return ret;
}
else
{
hr = VariantCopyInd(&ret, pvarFalsePart);
HrCheckAndRaiseError(hr);
return ret;
}
}
Хакер писал(а):Откуда информация, что второе выражение оптимальнее?
The trick писал(а):Можно заюзать арифметику с насыщением (SIMD).
r = (r And (r > 0)) - ((r - 255) And (r > 255))
alibek писал(а):А что такое клампинг?
alibek писал(а):r and 255 чтобы обрезать по 8 битам.
alibek писал(а):что-то вроде +255*not(r and &hfffffff0) чтобы присвоить 255 при переполнении 8 бит.
If: 0.0629
Math: 0.032456
Logic: 0.034268
If: 0.026896
Хакер писал(а):Более объективный способ замера:
Хакер писал(а):И вариант с CMOV
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 74