开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 378|回复: 7
打印 上一主题 下一主题
收起左侧

[其它源码] [Delphi代码]闲着没事28w结构化数据读取优化到90ms

[复制链接]
跳转到指定楼层
楼主
发表于 5 天前 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   浙江省金华市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 嫂子 于 2026-5-4 22:03 编辑

原帖:
关于结构体字节集转换的效率问题_精易论坛

分析:
通过原帖得知  读取逻辑是
跳过4字节  读取 4个无符号短整 4个整  然后跳过4字节

实操思路:
第一次 原帖思路
按照原帖逻辑 跳过4字节 然后 直接将8个数组 组合一个结构体 结构体最后加一个成员 x 整数型 刚好填补 每次跳过4字节。
逐行读取写出  速度2s

第二次 优化读取
改成批量读取 发现 最后一个结构没有了最后的4字节导致失败
灵机一动 大腿一拍 尼玛被原帖带歪了
文件本质结构:   4字节+24字节(要的数据) +4字节+24字节(要的数据)
遂改结构成   x 整数+原先的8成员。完美用x覆盖未知的4字节(大概是头部信息之类的)

一次性读取 耗时只需要2ms了。剩下逐行写出成为了瓶颈 总耗时700ms
第三次 优化写出
既然读取已经完美了,写出的优化自然是 内存拼接 一次性写出了。
使用stringbuilder 1M缓冲区 组合后 一次性写出

结果:89ms

代码如下:
结构体:
[Delphi] 纯文本查看 复制代码
  TV = record
    unknown: Integer;
    v1, v2, v3, v4: Word;
    V5, v6, v7, v8: Integer;
  end;

操作代码:
[Delphi] 纯文本查看 复制代码
procedure TForm1.Button1Click(Sender: TObject);
var
  Bf: array of Tv;
begin
  var St := TStopwatch.StartNew; // 启动计时
  var Sr := TFileStream.Create('D:\Download\xx\xx.dat', fmOpenRead); // 原始文件
  var sb := Tstringbuilder.Create(1024 * 1024); // SB缓冲区1M
  var MaxCount: Int64 := Sr.Size div 28; // 算出总记录数
  Setlength(Bf, MaxCount); // 直接给数组申请缓存
  sr.ReadBuffer(bf[0], MaxCount * 28); // 一次性全部读取
  for var i := 0 to MaxCount - 1 do // 挨个塞入Sb
  begin
    var v := bf;
    SB
        .Append(v.v1)
        .Append(#9)
        .Append(v.v2)
        .Append(#9)
        .Append(v.v3)
        .Append(#9)
        .Append(v.v4)
        .Append(#9)
        .Append(v.v5)
        .Append(#9)
        .Append(v.v6)
        .Append(#9)
        .Append(v.v7)
        .Append(#9)
        .Append(v.v8)
        .Append(#13#10);
  end;
  // 最后一次性写出
  Tfile.WriteAllText('结果.txt', sb.ToString);
  sr.Free; // 释放原始文件流
  sb.Free; // 释放sb
  st.Stop; // 停止计时
  memo1.Lines.Add(st.ElapsedMilliseconds.ToString + 'ms');
end;


结帖率:96% (482/502)

签到天数: 3 天

8
发表于 3 天前 | 只看该作者   内蒙古自治区乌海市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 6 天

7
发表于 3 天前 | 只看该作者   广西壮族自治区玉林市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)

签到天数: 4 天

6
发表于 3 天前 | 只看该作者   广东省佛山市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 8 天

地下
 楼主| 发表于 4 天前 | 只看该作者   浙江省金华市
一粒红尘 发表于 2026-5-5 17:31
Delphi  不是停更了么都

一直都在更
回复 支持 反对

使用道具 举报

结帖率:98% (48/49)

签到天数: 7 天

地板
发表于 4 天前 | 只看该作者   内蒙古自治区呼伦贝尔市
Delphi  不是停更了么都
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 7 天

板凳
发表于 4 天前 | 只看该作者   浙江省温州市
这个我看不懂,我是易语言初学者
回复 支持 反对

使用道具 举报

签到天数: 8 天

沙发
 楼主| 发表于 5 天前 | 只看该作者   浙江省金华市
至此,代码清晰,速度满意,要再优化就只能抠细节搞了。没意义了。现在代码可读性最佳效果最佳 取得了平衡
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表