当前位置: 首页 > news >正文

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

改动的原因

去掉了一层循环。

结论

下次不吵架了。

http://www.dtcms.com/a/553563.html

相关文章:

  • 全连接层的第二层是怎么减少神经节点数
  • Rust开发之泛型约束与where子句的应用
  • 什么是CVE?如何通过SAST/静态分析工具Perforce QAC 和 Klocwork应对CVE?
  • 通过 Nix 管理 C 和 C++ 依赖项
  • Kimi Linear 论文阅读笔记:第一次“线性注意力”全面胜过全注意力
  • 金华网站开发开发网站需要什么硬件
  • 使用mysql客户端工具造数据方法入门
  • 光刻胶分类与特性——g/i线光刻胶及东京应化TP-3000系列胶典型配方(下)
  • Spring Boot项目快速稳健架构指南
  • 网站wordpress错误网站设计宽度尺寸
  • 图像分割技术总结
  • iptables u32 match 对字节后退的支持
  • gymnasium中space用法
  • 【win11】4:funasr配置python依赖项并下载模型
  • 网站官网上的新闻列表怎么做官网排名优化方案
  • Flink 优化-状态及 Checkpoint 调优
  • 会员中心网站模板网站优化要素
  • 微软简化Windows更新!命名更加直观:只保留重点
  • 7.进程控制(三)
  • MSA 基因序列对比差异化 相关使用
  • Kafka(文件)数据存储、清理机制、高性能设计
  • 湖南免费网站建设怀化网站建设有哪些
  • Redis 从基础到实战
  • 投标建设用地是哪个网站广州seo培训
  • 做电影网站需要注意什么软件网站开发 erp系统开发
  • 删除wps的空白页
  • 计算机网络 —— F / 应用层
  • 62 VueComponent watcher 的实现
  • Ethernaut Level 15: Naught Coin - ERC20 approve/transferFrom漏洞
  • PySide6 实现win10 手动与自动切换主题 借助系统托盘