关于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;

改动的原因

去掉了一层循环。

结论

下次不吵架了。

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月巴月巴白勺合鸟月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值