关于Delphi的一次吵架
起因
在群里和一个网友吵架了。俺的观点是,俺看不懂业务和算法,也能改代码。网友不认可俺的观点,于是就吵了起来。嗯,俺今年18岁,火气大。网友就给了俺他的代码,让俺看。俺说看不懂,但是可以改。结果是俺改了,优化了几处,一处速度提高了8%,一处提高了30% 。俺确实看不懂他写的。对方说都是小改动。俺就怼他,反正俺改了,小改动也是改。
说句实话,对方确实在算法上很好,但是就是 Delphi用的太差。俺的所有改动,都没有改变算法,仅仅是delphi语言方面的一些优化。
改动1
对方的源代码是
function Is2SquaresCrossed2(p0_, p1_: TLite9SquaresPtr): i32;
var
i: i32;
begin
for i := 0 to MAX_ELEMENT - 1 do
begin
if (p0_^[i].x = p1_^[i].x) or (p0_^[i].y = p1_^[i].y) then
begin
Result := 1;
Exit;
end; { if (p0_^[i].x = p1_^[i].x )}
end; { for i}
Result := 0;
end;
俺改为
function Is2SquaresCrossed2(p0_, p1_: TLite9SquaresPtr): i32;
var
i: i32;
p0_i, p1_i: TCordPointPtr;
begin
p0_i := @(p0_^[0]);
p1_i := @(p1_^[0]);
for i := 0 to MAX_ELEMENT - 1 do
begin
if (p0_i^.x = p1_i^.x) or (p0_i^.y = p1_i^.y) then
begin
Result := 1;
Exit;
end;
inc(p0_i);
inc(p1_i);
end;
Result := 0;
end;
改动的原因
去掉了[i] , 改为p0_i,速度快5-8%
改动2
对方的源代码是
TCordPoint = record
x: i8;
y: i8;
state: i8;
value: i8; {从0开始计算的坐标,左上角是0,0} {方格位置的值1-9}
end;
type
TCordNode = record
x: i8;
y: i8;
end;
俺改为
type
TCordPoint = record
case Integer of
0: (
x: i8;
y: i8;
state: i8;
value: i8; {从0开始计算的坐标,左上角是0,0} {方格位置的值1-9}
);
1: (
pt: u16;
pstate: i8;
pvalue: i8;
);
2: (
data: i32;
)
end;
type
TCordNode = record
case Integer of
0: (
x: i8;
y: i8; );
1: (
pt: u16;
)
end;
改动的原因
因为对方的原代码之中有很多这样的代码
for i := 0 to MAX_ELEMENT - 1 do
begin
New(PMNLst[i]);
New(NumIndexPatternLst[i]);
for j := 0 to MAX_PMN - 1 do
begin
for k := 0 to 8 do
begin {赋予非法值}
PMNLst[i]^[j][0].x := 99;
PMNLst[i]^[j][k].y := 99;
PMNLst[i]^[j][k].value := 99;
PMNLst[i]^[j][k].state := 99;
end; { for k}
end; { for j}
for j := 0 to MAX_PMN - 1 do
begin
for k := 0 to 8 do
begin {赋予非法值}
NumIndexPatternLst[i]^[j][0].x := 99;
NumIndexPatternLst[i]^[j][k].y := 99;
NumIndexPatternLst[i]^[j][k].value := 99;
NumIndexPatternLst[i]^[j][k].state := 99;
end; { for k}
end; { for j}
Max_num[i] := -1;
俺改了record的定义之后,这种处理就可以优化为
for i := 0 to MAX_ELEMENT - 1 do
begin
New(PMNLst[i]);
New(NumIndexPatternLst[i]);
for j := 0 to MAX_PMN - 1 do
begin
for k := 0 to 8 do
begin {赋予非法值}
PMNLst[i]^[j][k].data := $63636363;
end; { for k}
end; { for j}
for j := 0 to MAX_PMN - 1 do
begin
for k := 0 to 8 do
begin {赋予非法值}
NumIndexPatternLst[i]^[j][0].data := $63636363;
end; { for k}
end; { for j}
Max_num[i] := -1;
他的代码里还有很多代码类似的代码 ,我也优化了
例如
VarCordlst[vcnt].x := map_ptr_^[i, j].x;
VarCordlst[vcnt].y := map_ptr_^[i, j].y;
我会优化为
VarCordlst[vcnt].pt := map_ptr_^[i, j].pt;
这些优化下来,整体快了30%
改动三
对方的源代码是
TmpSq := ResultPMNp_^[ResultCntP_^];
for i1 := 1 to MAX_ELEMENT do
begin
for i := 0 to MAX_ELEMENT - 1 do
begin
if TmpSq[i].value = i1 then
begin
IdxResult_[ResultCntP_^][i1 - 1].x := TmpSq[i].x;
IdxResult_[ResultCntP_^][i1 - 1].y := TmpSq[i].y;
IdxResult_[ResultCntP_^][i1 - 1].value := i1;
break;
end; { if TmpSq[i].value = i1}
end; { for i}
end; { for i1}
俺改为
TmpSq := ResultPMNp_^[ResultCntP_^];
for i := 0 to MAX_ELEMENT - 1 do
begin
j := TmpSq[i].value - 1;
IdxResult_[ResultCntP_^][j].pt := TmpSq[i].pt;
IdxResult_[ResultCntP_^][j].value := TmpSq[i].value;
end;
改动的原因
去掉了一层循环。
结论
下次不吵架了。
