|
|

分享源码
| 界面截图: |
|
| 是否带模块: |
调用了模块 |
| 备注说明: |
- |
本帖最后由 APPLEUFO 于 2026-6-6 17:07 编辑
深度思考
你说得对,确实是一句话
原生数组取了jz之后,WriteFile / ReadFile 一样是一条 API 搞定,文件 I/O 这块内存数组没有独占优势。
那内存数组真正的独占优势其实就这几个:
1. 地址永远不变
原生数组:重定义数组(aaa, 假, 2000) → 地址可能搬家,之前存的jz作废
内存数组:jz创建后固定,永远不会变
如果你把jz存下来给 DLL 或定时器用,原生数组哪天重定义了,jz就悬空了,内存数组不会。
2. 不用每次取地址
原生数组:每次写文件都要 jz = 取原生数组地址(aaa[1], aaa[1], 4)
内存数组:直接 ccc.写到文件("xxx.bin"),jz已经在内部存着了
省一步,不容易出错。
3. 跨语言共享数据的"标准接口"
写成 .bin 文件后,Python / C / C++ 都能直接读,格式是纯二进制裸数据,没有任何 EPL 私有头信息。原生数组虽然也能做到,但 EPL 内部数组前面有没有隐藏的长度头之类的,不确定。内存数组从 HeapAlloc 出来的就是纯裸缓冲区,100% 确定。
老实说
如果你的场景就是 EPL 内部用,原生数组 + 取地址 + Win32 API 完全够用,不需要内存数组类。
内存数组类最大的价值是:把"取地址→打开文件→写入→关闭"封装成了 写到文件() 一行调用,不用记那堆魔法数字和 API 参数,是工程便利性,不是性能优势。
第一个版本 我问了千问 怎么加速 他说汇编加宏展开,可是它玩不明白 到处调试报错
后面版本 龙虾它换了读整数 写整数的函数以后 加速了 几十倍。就没问宏展开和汇编的事情了 现在只比原生数组慢山五倍
| 窗口程序集名 | 保 留 | 保 留 | 备 注 | | 窗口程序集_启动窗口 | | | | | 变量名 | 类 型 | 数组 | 备 注 | | aaa | 整数型 | 0 | | bbb | 整数型 | 0 | | ccc | 类模块_整数型固定数组 | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | n1 | 整数型 | | | | ls | 整数型 | | | | 局变_总数 | 整数型 | | | | 临时数组 | 整数型 | | 0 | 置随机数种子 ()局变_总数 = 10000000 计时器启动 ()重定义数组 (aaa, 假, 局变_总数 ) 计次循环首 (取数组成员数 (aaa ), n1 )  aaa [n1 ] = n1 计次循环尾 () 计次循环首 (取数组成员数 (aaa ), n1 )  ls = ls + aaa [n1 ] 计次循环尾 ()计时器结束 ()调试输出 (ls, , , ) ls = 0 计时器启动 ()ccc. 创建内存数组_整数型 (局变_总数 )ccc. 清零 ()调试输出 (“=======================”) 计次循环首 (ccc. 取数组成员数目 (), n1 ) ccc. 写整数_加速 (n1, n1 ) 计次循环尾 ()调试输出 (“=======================”) 计次循环首 (ccc. 取数组成员数目 (), n1 )  ls = ls + ccc. 读整数_加速 (n1 ) 计次循环尾 () 调试输出 (ls, , , )计时器结束 () ccc. 创建内存数组_整数型 (100 ) 计次循环首 (ccc. 取数组成员数目 (), n1 ) ccc. 写整数 (n1, n1 ) 计次循环尾 ()ccc. 写到文件 (“C:\数据.bin”)ccc. 清零 ()调试输出 (“------------ ”) ccc. 从文件读入 (“C:\数据.bin”, ) 计次循环首 (ccc. 取数组成员数目 (), n1 ) 调试输出 (ccc. 读整数 (n1 )) 计次循环尾 ()鸣叫 ()
| 窗口程序集名 | 保 留 | 保 留 | 备 注 | | 类模块_整数型固定数组, , 公开 | | | | | 变量名 | 类 型 | 数组 | 备 注 | | 程变_数组jz | 整数型 | | | 程变_元素数量 | 整数型 | | 如果真 (程变_数组jz ≠ 0 ) 释放内存 (获取当前进程默认堆 (), 0, 程变_数组jz ) 程变_数组jz = 0  程变_元素数量 = 0  如果真 (参数_数组个数 ≤ 0 ) 返回 (假) 局变_分配大小 = 参数_数组个数 × 4 程变_数组jz = 分配内存 (获取当前进程默认堆 (), 1, 局变_分配大小 ) 如果真 (程变_数组jz = 0 ) 返回 (假) 程变_元素数量 = 参数_数组个数 返回 (真) 内存_填充 (程变_数组jz, 程变_元素数量 × 4, 0 )返回 (程变_元素数量 ) 如果真 (参数_索引 < 1 或 参数_索引 > 程变_元素数量 ) 返回 (假) 写整数_加速 (参数_索引, 参数_值 )返回 (真) 如果真 (参数_索引 < 1 或 参数_索引 > 程变_元素数量 ) 返回 (0 ) 返回 (读整数_加速 (参数_索引 )) 写整数到地址 (程变_数组jz (参数_索引 - 1 ) × 4, 参数_值, 4 ) 从地址读整数 (局变_结果, 程变_数组jz (参数_索引 - 1 ) × 4, 4 )返回 (局变_结果 ) 如果真 (程变_元素数量 > 1 ) 快速排序_内部 (1, 程变_元素数量 ) |
| 快速排序_内部 | | | |
| 参数_左边界 | 整数型 | | | | 参数_右边界 | 整数型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 局变_i | 整数型 | | | | 局变_j | 整数型 | | | | 局变_基准值 | 整数型 | | | | 局变_临时值 | 整数型 | | |
局变_i = 参数_左边界 局变_j = 参数_右边界 局变_基准值 = 读整数_加速 ( (参数_左边界 + 参数_右边界 ) ÷ 2 ) 判断循环首 (局变_i ≤ 局变_j )  判断循环首 (读整数_加速 (局变_i ) < 局变_基准值 )  局变_i = 局变_i + 1  判断循环尾 ()  判断循环首 (读整数_加速 (局变_j ) > 局变_基准值 )  局变_j = 局变_j - 1  判断循环尾 ()  如果真 (局变_i ≤ 局变_j )  局变_临时值 = 读整数_加速 (局变_i ) 写整数_加速 (局变_i, 读整数_加速 (局变_j ))  写整数_加速 (局变_j, 局变_临时值 )  局变_i = 局变_i + 1   局变_j = 局变_j - 1   判断循环尾 () 如果真 (参数_左边界 < 局变_j ) 快速排序_内部 (参数_左边界, 局变_j ) 如果真 (局变_i < 参数_右边界 ) 快速排序_内部 (局变_i, 参数_右边界 ) | 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 局变_文件句柄 | 整数型 | | | | 局变_实际写入 | 整数型 | | |
局变_文件句柄 = 创建文件 (参数_文件名, 1073741824, 0, 0, 2, 128, 0 ) 如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0 ) 返回 (假) 写文件 (局变_文件句柄, 程变_数组jz, 程变_元素数量 × 4, 局变_实际写入, 0 )关闭句柄 (局变_文件句柄 ) 返回 (真)|
| 从文件读入 | 逻辑型 | | |
| 参数_文件名 | 文本型 | | | | 参数_元素数 | 整数型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 局变_文件句柄 | 整数型 | | | | 局变_实际读取 | 整数型 | | | | 局变_读取结果 | 逻辑型 | | | | 局变_文件字节数 | 整数型 | | |
局变_文件句柄 = 创建文件 (参数_文件名, 2147483648, 0, 0, 3, 128, 0 ) 如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0 ) 返回 (假) 如果真 (是否为空 (参数_元素数 ))  局变_文件字节数 = 取文件大小 (局变_文件句柄, 0 ) 参数_元素数 = 局变_文件字节数 ÷ 4 如果真 (创建内存数组_整数型 (参数_元素数 ) = 假) 关闭句柄 (局变_文件句柄 ) 返回 (假) 局变_读取结果 = 读文件 (局变_文件句柄, 程变_数组jz, 参数_元素数 × 4, 局变_实际读取, 0 ) 关闭句柄 (局变_文件句柄 )返回 (真) 返回 (程变_数组jz )返回 (程变_元素数量 × 4 ) 内存拷贝到数组 (参数_目标数组 [1 ], 程变_数组jz, 程变_元素数量 × 4 ) 如果真 (程变_数组jz = 0 ) 返回 (假) 局变_源jz = 取原生数组地址 (参数_源数组 [1 ], 参数_源数组 [1 ], 4 )内存_拷贝 (程变_数组jz, 局变_源jz, 程变_元素数量 × 4 )返回 (真)|
| 原生数组写到文件 | 逻辑型 | | |
| 参数_数组 | 整数型 | | | | 参数_文件名 | 文本型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 局变_jz | 整数型 | | | | 局变_文件句柄 | 整数型 | | | | 局变_实际写入 | 整数型 | | |
局变_jz = 取原生数组地址 (参数_数组 [1 ], 参数_数组 [1 ], 4 )局变_文件句柄 = 创建文件 (参数_文件名, 1073741824, 0, 0, 2, 128, 0 ) 如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0 ) 返回 (假) 写文件 (局变_文件句柄, 局变_jz, 取数组成员数 (参数_数组 ) × 4, 局变_实际写入, 0 )关闭句柄 (局变_文件句柄 )返回 (真)|
| 原生数组从文件读入 | 逻辑型 | | |
| 参数_文件名 | 文本型 | | | | 参数_数组 | 整数型 | | | |
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 局变_jz | 整数型 | | | | 局变_文件句柄 | 整数型 | | | | 局变_实际读取 | 整数型 | | | | 局变_文件字节数 | 整数型 | | |
局变_文件句柄 = 创建文件 (参数_文件名, 2147483648, 0, 0, 3, 128, 0 ) 如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0 ) 返回 (假) 局变_文件字节数 = 取文件大小 (局变_文件句柄, 0 )重定义数组 (参数_数组, 假, 局变_文件字节数 ÷ 4 )局变_jz = 取原生数组地址 (参数_数组 [1 ], 参数_数组 [1 ], 4 )读文件 (局变_文件句柄, 局变_jz, 局变_文件字节数, 局变_实际读取, 0 )关闭句柄 (局变_文件句柄 )返回 (真)
|
-
-
内存数组.zip
184.85 KB, 下载次数: 7, 下载积分: 精币 -2 枚
|