开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

12
返回列表 发新帖
楼主: APPLEUFO
收起左侧

[易语言纯源码] 和千问龙虾弄的一个内存数组 固定长度整数型

[复制链接]
结帖率:0% (0/2)
发表于 5 天前 | 显示全部楼层   广西壮族自治区玉林市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 11 天

发表于 5 天前 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 6 天

发表于 6 天前 | 显示全部楼层   河北省石家庄市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 6 天

 楼主| 发表于 6 天前 | 显示全部楼层   福建省福州市
WorkBuddy
深度思考
老实说:单元素读写已经接近 EPL 的极限了
每次调用的开销拆解:

写整数_加速(索引, 值)
  → EPL 压栈/跳转(~10ns)
    → 写整数到地址 DLL IAT 跳转(~5ns)
      → RtlMoveMemory 内部(~5ns)
        → 实际写 4 字节(~1ns)
真正干活的只有最后 1ns,前面 20ns 都是调用开销。 EPL 的函数调用机制你改不了。

三条路,收益递减
路线1:批量操作(已实现,最实用)
热循环里不要逐个读,拷贝到原生数组再遍历。前面已经做过了,78ms → 47ms。

路线2:写个 C DLL 做热循环
把整个循环搬进 C 里,EPL 只调一次:

c
复制
// fastlib.c → 编译成 fastlib.dll
__declspec(dllexport) int __cdecl SumArray(int* base, int count) {
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += base[i];    // 编译成单条 MOV 指令
    }
    return sum;
}
EPL 调用:

epl
复制
.DLL命令 求和, 整数型, "fastlib.dll", "SumArray"
    .参数 基址, 整数型, , , 内存数组基址
    .参数 数量, 整数型, , , 元素个数

结果 = 求和 (ccc.取基址 (), ccc.取数组成员数目 ())
一次调用完成 100 万次累加,时间接近 0。 这才是真正消灭调用开销的办法。

路线3:EPL 置入代码(内联汇编)
EPL 支持 置入代码 写机器码,但极度脆弱,换个编译器版本可能就崩:

epl
复制
.子程序 写整数_极速, , 公开, 内联汇编版,不稳定慎用
.参数 参数_地址, 整数型       ' 直接传地址,不是索引
.参数 参数_值, 整数型

' mov eax, [ebp+12]  ; 取值
' mov [ebp+8], eax   ; 写入地址
' 不推荐,维护成本太高
置入代码 ({ 139, 69, 12, 139, 85, 8, 137, 2 })
不推荐用在正式项目里,调试困难,一崩就整个程序挂。

建议
方法        速度        可靠性        推荐度
拷贝到原生数组        快        ? 稳定        ??? 首选
C DLL 做热循环        最快        ? 稳定        ??? 高频场景必用
置入代码        理论最快        ? 脆弱        ? 不推荐
你的量化筛选如果真到了性能瓶颈,写个 C DLL 是正路。 几十行 C 代码就能把排序、累加、筛选全做了,EPL 只负责界面和流程控制。



龙虾对  读写瓶颈 这样说

回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 6 天

 楼主| 发表于 6 天前 | 显示全部楼层   福建省福州市
WorkBuddy
深度思考
老实说:单元素读写已经接近 EPL 的极限了
每次调用的开销拆解:

写整数_加速(索引, 值)
  → EPL 压栈/跳转(~10ns)
    → 写整数到地址 DLL IAT 跳转(~5ns)
      → RtlMoveMemory 内部(~5ns)
        → 实际写 4 字节(~1ns)
真正干活的只有最后 1ns,前面 20ns 都是调用开销。 EPL 的函数调用机制你改不了。

三条路,收益递减
路线1:批量操作(已实现,最实用)
热循环里不要逐个读,拷贝到原生数组再遍历。前面已经做过了,78ms → 47ms。

路线2:写个 C DLL 做热循环
把整个循环搬进 C 里,EPL 只调一次:

c
复制
// fastlib.c → 编译成 fastlib.dll
__declspec(dllexport) int __cdecl SumArray(int* base, int count) {
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += base[i];    // 编译成单条 MOV 指令
    }
    return sum;
}
EPL 调用:

epl
复制
.DLL命令 求和, 整数型, "fastlib.dll", "SumArray"
    .参数 基址, 整数型, , , 内存数组基址
    .参数 数量, 整数型, , , 元素个数

结果 = 求和 (ccc.取基址 (), ccc.取数组成员数目 ())
一次调用完成 100 万次累加,时间接近 0。 这才是真正消灭调用开销的办法。

路线3:EPL 置入代码(内联汇编)
EPL 支持 置入代码 写机器码,但极度脆弱,换个编译器版本可能就崩:

epl
复制
.子程序 写整数_极速, , 公开, 内联汇编版,不稳定慎用
.参数 参数_地址, 整数型       ' 直接传地址,不是索引
.参数 参数_值, 整数型

' mov eax, [ebp+12]  ; 取值
' mov [ebp+8], eax   ; 写入地址
' 不推荐,维护成本太高
置入代码 ({ 139, 69, 12, 139, 85, 8, 137, 2 })
不推荐用在正式项目里,调试困难,一崩就整个程序挂。

建议
方法        速度        可靠性        推荐度
拷贝到原生数组        快        ? 稳定        ??? 首选
C DLL 做热循环        最快        ? 稳定        ??? 高频场景必用
置入代码        理论最快        ? 脆弱        ? 不推荐
你的量化筛选如果真到了性能瓶颈,写个 C DLL 是正路。 几十行 C 代码就能把排序、累加、筛选全做了,EPL 只负责界面和流程控制。



龙虾对  读写瓶颈 这样说
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 6 天

 楼主| 发表于 6 天前 | 显示全部楼层   福建省福州市
WorkBuddy
深度思考
老实说:单元素读写已经接近 EPL 的极限了
每次调用的开销拆解:

写整数_加速(索引, 值)
  → EPL 压栈/跳转(~10ns)
    → 写整数到地址 DLL IAT 跳转(~5ns)
      → RtlMoveMemory 内部(~5ns)
        → 实际写 4 字节(~1ns)
真正干活的只有最后 1ns,前面 20ns 都是调用开销。 EPL 的函数调用机制你改不了。

三条路,收益递减
路线1:批量操作(已实现,最实用)
热循环里不要逐个读,拷贝到原生数组再遍历。前面已经做过了,78ms → 47ms。

路线2:写个 C DLL 做热循环
把整个循环搬进 C 里,EPL 只调一次:

c
复制
// fastlib.c → 编译成 fastlib.dll
__declspec(dllexport) int __cdecl SumArray(int* base, int count) {
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += base;    // 编译成单条 MOV 指令
    }
    return sum;
}
EPL 调用:

epl
复制
.DLL命令 求和, 整数型, "fastlib.dll", "SumArray"
    .参数 基址, 整数型, , , 内存数组基址
    .参数 数量, 整数型, , , 元素个数

结果 = 求和 (ccc.取基址 (), ccc.取数组成员数目 ())
一次调用完成 100 万次累加,时间接近 0。 这才是真正消灭调用开销的办法。

路线3:EPL 置入代码(内联汇编)
EPL 支持 置入代码 写机器码,但极度脆弱,换个编译器版本可能就崩:

epl
复制
.子程序 写整数_极速, , 公开, 内联汇编版,不稳定慎用
.参数 参数_地址, 整数型       ' 直接传地址,不是索引
.参数 参数_值, 整数型

' mov eax, [ebp+12]  ; 取值
' mov [ebp+8], eax   ; 写入地址
' 不推荐,维护成本太高
置入代码 ({ 139, 69, 12, 139, 85, 8, 137, 2 })
不推荐用在正式项目里,调试困难,一崩就整个程序挂。

建议
方法        速度        可靠性        推荐度
拷贝到原生数组        快        ? 稳定        ??? 首选
C DLL 做热循环        最快        ? 稳定        ??? 高频场景必用
置入代码        理论最快        ? 脆弱        ? 不推荐
你的量化筛选如果真到了性能瓶颈,写个 C DLL 是正路。 几十行 C 代码就能把排序、累加、筛选全做了,EPL 只负责界面和流程控制。
龙虾对  读写瓶颈 这样说
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 6 天

 楼主| 发表于 6 天前 | 显示全部楼层   福建省福州市
WorkBuddy
深度思考
老实说:单元素读写已经接近 EPL 的极限了
每次调用的开销拆解:

写整数_加速(索引, 值)
  → EPL 压栈/跳转(~10ns)
    → 写整数到地址 DLL IAT 跳转(~5ns)
      → RtlMoveMemory 内部(~5ns)
        → 实际写 4 字节(~1ns)
真正干活的只有最后 1ns,前面 20ns 都是调用开销。 EPL 的函数调用机制你改不了。

三条路,收益递减
路线1:批量操作(已实现,最实用)
热循环里不要逐个读,拷贝到原生数组再遍历。前面已经做过了,78ms → 47ms。

路线2:写个 C DLL 做热循环
把整个循环搬进 C 里,EPL 只调一次:

c
复制
// fastlib.c → 编译成 fastlib.dll
__declspec(dllexport) int __cdecl SumArray(int* base, int count) {
    int sum = 0;
    for (int i = 0; i < count; i++) {
        sum += base[i];    // 编译成单条 MOV 指令
    }
    return sum;
}
EPL 调用:

epl
复制
.DLL命令 求和, 整数型, "fastlib.dll", "SumArray"
    .参数 基址, 整数型, , , 内存数组基址
    .参数 数量, 整数型, , , 元素个数

结果 = 求和 (ccc.取基址 (), ccc.取数组成员数目 ())
一次调用完成 100 万次累加,时间接近 0。 这才是真正消灭调用开销的办法。

路线3:EPL 置入代码(内联汇编)
EPL 支持 置入代码 写机器码,但极度脆弱,换个编译器版本可能就崩:

epl
复制
.子程序 写整数_极速, , 公开, 内联汇编版,不稳定慎用
.参数 参数_地址, 整数型       ' 直接传地址,不是索引
.参数 参数_值, 整数型

' mov eax, [ebp+12]  ; 取值
' mov [ebp+8], eax   ; 写入地址
' 不推荐,维护成本太高
置入代码 ({ 139, 69, 12, 139, 85, 8, 137, 2 })
不推荐用在正式项目里,调试困难,一崩就整个程序挂。

建议
方法        速度        可靠性        推荐度
拷贝到原生数组        快        ✅ 稳定        ⭐⭐⭐ 首选
C DLL 做热循环        最快        ✅ 稳定        ⭐⭐⭐ 高频场景必用
置入代码        理论最快        ❌ 脆弱        ⭐ 不推荐
你的量化筛选如果真到了性能瓶颈,写个 C DLL 是正路。 几十行 C 代码就能把排序、累加、筛选全做了,EPL 只负责界面和流程控制。
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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