计算密集型循环内的复杂条件操作对编译器进行的优化尝试具有很强的抑制作用。一般而言,消除所有算术和逻辑 IF 操作而代之以块 IF 操作是一条很好的规则,应予以遵守:
Original Code:
IF(A(I)-DELTA) 10,10,11
10 XA(I) = XB(I)*B(I,I)
XY(I) = XA(I) - A(I)
GOTO 13
11 XA(I) = Z(I)
XY(I) = Z(I)
IF(QZDATA.LT.0.) GOTO 12
ICNT = ICNT + 1
ROX(ICNT) = XA(I)-DELTA/2.
12 SUM = SUM + X(I)
13 SUM = SUM + XA(I)
Untangled Code:
IF(A(I).LE.DELTA) THEN
XA(I) = XB(I)*B(I,I)
XY(I) = XA(I) - A(I)
ELSE
XA(I) = Z(I)
XY(I) = Z(I)
IF(QZDATA.GE.0.) THEN
ICNT = ICNT + 1
ROX(ICNT) = XA(I)-DELTA/2.
ENDIF
SUM = SUM + X(I)
ENDIF
SUM = SUM + XA(I)
|
使用块 IF 不仅可以提高编译器生成优化代码的机会,而且可以增强可读性并确保可移植性。