开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 1330|回复: 10
收起左侧

[已解决] 关于结构体字节集转换的效率问题

 关闭 [复制链接]
结帖率:83% (19/23)
发表于 2023-10-2 10:36:38 | 显示全部楼层 |阅读模式   河北省廊坊市
5精币
处理结构体的字节集,转换成可读文本,易语言处理也太慢了,用了2种方式,直接读和打开文件,结果都是很慢,比别人用其他语音处理慢几十倍,同样8线程处理若干此文件,其他语言只需要几秒,易语言需要分钟计。。。。估计是我写的问题,不应该慢这么多啊。。。求大神赐教正确写法。
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
_按钮1_被单击  
启动线程 (&测试1, , )
子程序名返回值类型公开备 注
测试1  
变量名类 型静态数组备 注
大字节集字节集 
小字节集字节集 
n整数型 
局_v1整数型 
局_v2整数型 
局_v3整数型 
局_v4整数型 
局_v5整数型 
局_v6整数型 
局_v7整数型 
局_v8整数型 
结构体长度整数型 
k整数型 
临时数组文本型0
开始时间整数型 
开始时间 = 取启动时间 ()
大字节集 = 读入文件 (取运行目录 ()“xx.dat”)
结构体长度 = 取字节集长度 (大字节集) ÷ 28
n = 5
循环判断首 ()
小字节集 = 取字节集中间 (大字节集, n, 2)  ' 据说易语言需要先取字节集后取数据,不然容易出错,这算BUG吗
局_v1 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 取字节集中间 (大字节集, n, 2)
局_v2 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 取字节集中间 (大字节集, n, 2)
局_v3 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 取字节集中间 (大字节集, n, 2)
局_v4 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 取字节集中间 (大字节集, n, 4)
局_v5 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 取字节集中间 (大字节集, n, 4)
局_v6 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 取字节集中间 (大字节集, n, 4)
局_v7 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 取字节集中间 (大字节集, n, 4)
局_v8 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 8
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
加入成员 (临时数组, 到文本 (局_v1)字符 (9)到文本 (局_v2)字符 (9)到文本 (局_v3)字符 (9)到文本 (局_v4)字符 (9)到文本 (局_v5)字符 (9)到文本 (局_v6)字符 (9)到文本 (局_v7)字符 (9)到文本 (局_v8))
k = k + 1
循环判断尾 (k < 结构体长度)
写到文件 (取运行目录 ()“\测试.txt”, 到字节集 (文本数组叠加 (临时数组)))
编辑框1.内容 = 到文本 (取启动时间 () - 开始时间)
子程序名返回值类型公开备 注
测试2  
变量名类 型静态数组备 注
小字节集字节集 
局_v1整数型 
局_v2整数型 
局_v3整数型 
局_v4整数型 
局_v5整数型 
局_v6整数型 
局_v7整数型 
局_v8整数型 
临时数组文本型0
开始时间整数型 
文件号整数型 
开始时间 = 取启动时间 ()
文件号 = 打开文件 (取运行目录 ()“xx.dat”, 1, )
移动读写位置 (文件号, #文件首, 4)
判断循环首 (是否在文件尾 (文件号, ))
小字节集 = 读入字节集 (文件号, 2)
局_v1 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
小字节集 = 读入字节集 (文件号, 2)
局_v2 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
小字节集 = 读入字节集 (文件号, 2)
局_v3 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
小字节集 = 读入字节集 (文件号, 2)
局_v4 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
小字节集 = 读入字节集 (文件号, 4)
局_v5 = 取字节集数据 (小字节集, #整数型, 1)
小字节集 = 读入字节集 (文件号, 4)
局_v6 = 取字节集数据 (小字节集, #整数型, 1)
小字节集 = 读入字节集 (文件号, 4)
局_v7 = 取字节集数据 (小字节集, #整数型, 1)
小字节集 = 读入字节集 (文件号, 4)
局_v8 = 取字节集数据 (小字节集, #整数型, 1)
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
加入成员 (临时数组, 到文本 (局_v1)字符 (9)到文本 (局_v2)字符 (9)到文本 (局_v3)字符 (9)到文本 (局_v4)字符 (9)到文本 (局_v5)字符 (9)到文本 (局_v6)字符 (9)到文本 (局_v7)字符 (9)到文本 (局_v8))
移动读写位置 (文件号, #现行位置, 4)
判断循环尾 ()
关闭文件 (文件号)
写到文件 (取运行目录 ()“\测试1.txt”, 到字节集 (文本数组叠加 (临时数组)))
编辑框2.内容 = 到文本 (取启动时间 () - 开始时间)
子程序名返回值类型公开备 注
无符号短整数到整数整数型 强转整数。解决易语言不支持无符号短整数,超过32767就变成负数
参数名类 型参考可空数组备 注
短整数短整数型
' mov eax,[ebp 08h]
' movzx eax,word ax
' mov esp,ebp
' pop ebp
' ret 0004
置入代码 ({ 139, 69, 8, 15, 183, 192, 137, 236, 93, 194, 4, 0 })
返回 (0)
子程序名返回值类型公开备 注
文本数组叠加文本型 
参数名类 型参考可空数组备 注
数组文本文本型
变量名类 型静态数组备 注
s快速文本对象 
n整数型 
i整数型 
s.置可用内存 (1024 × 1000, )
n = 取数组成员数 (数组文本)
计次循环首 (n, i)
s.添加 (数组文本 [i]#换行符 )
计次循环尾 ()
返回 (s.取文本 (, ))
子程序名返回值类型公开备 注
_按钮2_被单击  
启动线程 (&测试2, , )


i支持库列表   支持库注释   
EThread多线程支持库
commobj通用对象支持库

最佳答案

查看完整内容

[e=0].版本 2 .支持库 commobj .支持库 spec .子程序 测试1 .局部变量 大字节集, 快速字节集对象 .局部变量 小字节集, 字节集 .局部变量 n, 整数型 .局部变量 局_v1, 整数型 .局部变量 局_v2, 整数型 .局部变量 局_v3, 整数型 .局部变量 局_v4, 整数型 .局部变量 局_v5, 整数型 .局部变量 局_v6, 整数型 .局部变量 局_v7, 整数型 .局部变量 局_v8, 整数型 .局部变量 结构体长度, 整数型 .局部变量 k, 整数型 .局部变量 临时数组, ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值

结帖率:97% (58/60)
发表于 2023-10-2 10:36:39 | 显示全部楼层   福建省宁德市
  
子程序名返回值类型公开备 注
测试1  
变量名类 型静态数组备 注
大字节集快速字节集对象 
小字节集字节集 
n整数型 
局_v1整数型 
局_v2整数型 
局_v3整数型 
局_v4整数型 
局_v5整数型 
局_v6整数型 
局_v7整数型 
局_v8整数型 
结构体长度整数型 
k整数型 
临时数组文本型0
开始时间整数型 
file整数型 
开始时间 = 取启动时间 ()
file = 打开文件 (取运行目录 ()“\测试.txt”, 4, 1)
大字节集.从文件读 (“C:\Users\Administrator\Downloads\xx\xx.dat”)
结构体长度 = 大字节集.取长度 () ÷ 28
n = 5
循环判断首 ()
小字节集 = 大字节集.取字节集 (n, 2)  ' 据说易语言需要先取字节集后取数据,不然容易出错,这算BUG吗
局_v1 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 大字节集.取字节集 (n, 2)
局_v2 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 大字节集.取字节集 (n, 2)
局_v3 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 大字节集.取字节集 (n, 2)
局_v4 = 无符号短整数到整数 (取字节集数据 (小字节集, #短整数型, 1))
n = n + 2
小字节集 = 大字节集.取字节集 (n, 4)
局_v5 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 大字节集.取字节集 (n, 4)
局_v6 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 大字节集.取字节集 (n, 4)
局_v7 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 4
小字节集 = 大字节集.取字节集 (n, 4)
局_v8 = 取字节集数据 (小字节集, #整数型, 1)
n = n + 8
写文本行 (file, 到文本 (局_v1)字符 (9)到文本 (局_v2)字符 (9)到文本 (局_v3)字符 (9)到文本 (局_v4)字符 (9)到文本 (局_v5)字符 (9)到文本 (局_v6)字符 (9)到文本 (局_v7)字符 (9)到文本 (局_v8))
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
k = k + 1
循环判断尾 (k < 结构体长度)
关闭文件 (file)
' 写到文件 (取运行目录 () + “\测试.txt”, 到字节集 (文本数组叠加 (临时数组)))
调试输出 (取启动时间 () - 开始时间)


i支持库列表   支持库注释   
commobj通用对象支持库
spec特殊功能支持库

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:97% (58/60)
发表于 2023-10-2 10:38:33 | 显示全部楼层   福建省宁德市
你知道用 快速文本对象  怎么就不知道用 快速字节集对象 呢
回复

使用道具 举报

结帖率:83% (19/23)
 楼主| 发表于 2023-10-2 10:43:18 | 显示全部楼层   河北省廊坊市
字节集附件,快速字节集也是比较慢的,

xx.rar

1.14 MB, 下载次数: 9

回复

使用道具 举报

结帖率:97% (58/60)
发表于 2023-10-2 10:53:47 | 显示全部楼层   福建省宁德市
96692 发表于 2023-10-2 10:43
字节集附件,快速字节集也是比较慢的,

改成快速字节集对象也就7秒钟就搞定了
回复

使用道具 举报

结帖率:83% (19/23)
 楼主| 发表于 2023-10-2 11:03:59 | 显示全部楼层   河北省廊坊市
鹏书 发表于 2023-10-2 10:54
[e=0].版本 2
.支持库 commobj
.支持库 spec

嗯,是快一点,但比其他语言还是差了很多。。。。。
回复

使用道具 举报

结帖率:100% (53/53)

签到天数: 9 天

发表于 2023-10-2 12:26:19 | 显示全部楼层   福建省宁德市
加入成员 (临时数组, 到文本 (局_v1) + 字符 (9) + 到文本 (局_v2) + 字符 (9) + 到文本 (局_v3) + 字符 (9) + 到文本 (局_v4) + 字符 (9) + 到文本 (局_v5) + 字符 (9) + 到文本 (局_v6) + 字符 (9) + 到文本 (局_v7) + 字符 (9) + 到文本 (局_v8))

又是加入数组、又是到文本()、又是数组叠加,这种写法本身效率就不高,就是写着方便,阅读性高。

这种你要高效处理就直接用写内存,速度嘎嘎起飞

看你的循环,数据量是有迹可循的,可以在循环首预先申请一定长度的内存空间
然后循环读取数据,直接将数据写入内存,最后指针到字节集把数据写到文件就好了,速度应该特别快,如果你dat文件不大应该几秒就处理完了
回复

使用道具 举报

结帖率:83% (19/23)
 楼主| 发表于 2023-10-2 12:29:31 | 显示全部楼层   河北省廊坊市
又试了试,繁琐了点,步骤,取出数据,转成文本,再把文本转成字节集加入数组,然后把字节集数组写入内存再写出,又快了一点,至此再也想不出,还能怎样提高速度了。。。。。 捕获.JPG
回复

使用道具 举报

结帖率:83% (19/23)
 楼主| 发表于 2023-10-2 12:34:24 | 显示全部楼层   河北省廊坊市
帅气与大侠 发表于 2023-10-2 12:26
加入成员 (临时数组, 到文本 (局_v1) + 字符 (9) + 到文本 (局_v2) + 字符 (9) + 到文本 (局_v3) + 字 ...

嗯嗯,主要这种方式对于我来说难度太大了,写不好,找不到相关例程,我胡乱写了下,是快不少,但我自知写的也是很垃圾。。。。
回复

使用道具 举报

结帖率:83% (19/23)
 楼主| 发表于 2023-10-2 12:43:41 | 显示全部楼层   河北省廊坊市
主要是内存写法,太不会了,单线程还能勉强试试,多线程处理怕是惨不忍睹。。。。。唉,不是易语言的问题,而是我菜
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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