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

DeepSeek辅助编写在windows中利用mingw编写用到内存映射文件和expat功能的C程序

同样的XMLTOCSV C程序编译后在8G内存arm64机器上运行比16GB内存amd64 机器上还快,估计是又是被WSL的慢IO拖了后腿。所以想在原生的WIndows下测试一下。
1.内存映射文件的改写
为了防止意外,我在网上找了一个windows内存映射文件例子,在mingw中编译通过,再把它上传给DeepSeek,

#include <windows.h>
#include <stdio.h>int main() {
HANDLE hFile = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
printf("创建文件失败!\n");
return -1;
}HANDLE hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 1024, NULL);
if (hMapping == NULL) {
printf("创建文件映射失败!\n");
CloseHandle(hFile);
return -1;
}char* pData = (char*)MapViewOfFile(hMapping, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0);
if (pData == NULL) {
printf("映射视图失败!\n");
CloseHandle(hMapping);
CloseHandle(hFile);
return -1;
}// 使用 pData 操作内存映射区域
UnmapViewOfFile(pData);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;
}

提示词

参考附件例子,把我们的xml解析mmap版本改为windows函数调用,只返回完整代码,不做别的。

再把张泽鹏先生的to-csv.c程序也上传给他,

把附件mmap版本改为windows函数调用,只返回完整代码,不做别的。
因为我的程序还依赖expat库,所以先编译张先生的程序。

REM 将gcc目录加入PATH
set path=%path%;C:\d\mingw64\bin
gcc tocsvwin.c -o tocsvwin.exe -O3In file included from C:/d/mingw64/x86_64-w64-mingw32/include/windef.h:9,from C:/d/mingw64/x86_64-w64-mingw32/include/windows.h:69,from tocsvwin.c:1:
tocsvwin.c:12:9: error: expected identifier or '(' before 'int'12 | int min(int, int);|         ^~~...
tocsvwin.c: In function 'read_text':
tocsvwin.c:257:25: error: empty character constant257 |     } else if (value == '') {

结果有错,原因是Windows中已经有min和max库函数,重名了。
第二个错误有点傻,它把’>‘抄成了空字符’'。很容易改好了,编译通过,执行成功。

C:\d>timer64 tocsvwin lineitem/xl/worksheets/sheet1.xml  A1:P1000000 out.csvKernel  Time =     0.156 =   11%
User    Time =     1.046 =   79%
Process Time =     1.203 =   91%    Virtual  Memory =      2 MB
Global  Time =     1.310 =  100%    Physical Memory =    321 MB

快得没有天理, 60万行16列的324MB xml文件,1秒半全写到了csv文件。
2.expat预编译库的使用
没有VC环境,从源代码编译expat库有点麻烦,看网上有没有现成编译好的,还真有。
我是从sourceforge下载的win64版本,github上也有, 两个是一模一样的。
把它解压缩到c:\d\expatwin目录,dll文件位于,而示例程序位于
所以编写如下命令行

C:\d\expatwin\Source\examples>gcc outline.c -I ../lib -L ../../bin -o outline.exe  -lexpat

编译通过,它是解析从标准输入读入的xml,我用了重定向来执行,就列出了xml的内容

C:\d\expatwin\Bin>..\Source\examples\outline <c:\d\sheet.xml
worksheet xmlns='http://schemas.openxmlformats.org/spreadsheetml/2006/main' xmlns:r='http://schemas.openxmlformats.org/officeDocument/2006/relationships'sheetViewssheetView showGridLines='false' workbookViewId='0'c r='F23' s='24'c r='H23' s='30' t='s'vmergeCells count='3'mergeCell ref='D3:D7'mergeCell ref='F3:F7'mergeCell ref='H3:H7'

再来编译我的内存映射文件版本程序,又是一个好笑的抄写错误,

C:\d>gcc expatxmlwin.c -I expatwin\Source\lib -L expatwin\bin -o expatxmlwinm.exe  -lexpat -O3
expatxmlwin.c: In function 'main':
expatxmlwin.c:259:67: error: 'ParseRange' has no member named 'start_pos'; did you mean 'start_row'?259 |     long start_pos = binary_search_row(xml_data, file_size, range.start_pos);|                                                                   ^~~~~~~~~|                                                                   start_row

按照提示改了编译就通过了,执行成功

C:\d\expatwin\Bin>\d\timer64 \d\expatxmlwinm.exe  /d/lineitem/xl/worksheets/sheet1.xml A2:P1000000
CSV宸蹭繚瀛樺埌 /d/lineitem/xl/worksheets/sheet1.csvKernel  Time =     0.093 =    2%
User    Time =     2.937 =   93%
Process Time =     3.031 =   96%    Virtual  Memory =    515 MB
Global  Time =     3.140 =  100%    Physical Memory =    639 MB

乱码是因为源代码是UTF8, 而Windows控制台字符集是cp936。用时差不多是1:2,和arm64平台一致。

而WSL2的比例,明显是IO不正常所致。

root@6ae32a5ffcde:/par# time ./expatmmap lineitem/xl/worksheets/sheet1.xml  A2:H1000000
start_pos=1192
CSV已保存到 lineitem/xl/worksheets/sheet1.csvreal    0m12.528s
user    0m2.027s
sys     0m1.044s
root@6ae32a5ffcde:/par# gcc to-csv.c -o tocsv -O3root@6ae32a5ffcde:/par# time ./tocsv lineitem/xl/worksheets/sheet1.xml  A1:H1000000 out.csvreal    0m10.735s
user    0m0.881s
sys     0m0.689s

文章转载自:

http://7aKb8Fuq.Lsgsn.cn
http://CTmEwNDu.Lsgsn.cn
http://Yiy833JP.Lsgsn.cn
http://EnFj0cju.Lsgsn.cn
http://zcvO6NvJ.Lsgsn.cn
http://KzyvKNn5.Lsgsn.cn
http://4TCWkZa0.Lsgsn.cn
http://et8DDezm.Lsgsn.cn
http://BFqkJikv.Lsgsn.cn
http://Na8PBSeZ.Lsgsn.cn
http://wNctSQC5.Lsgsn.cn
http://tPoKT4Js.Lsgsn.cn
http://tSckrXr6.Lsgsn.cn
http://l1B43DQ1.Lsgsn.cn
http://mxWSIN8V.Lsgsn.cn
http://cNHKxp7p.Lsgsn.cn
http://IvM0BfuY.Lsgsn.cn
http://p8j6Ltg6.Lsgsn.cn
http://4qIDINJ6.Lsgsn.cn
http://iwSPF03Y.Lsgsn.cn
http://heRl18lb.Lsgsn.cn
http://TO85s3xE.Lsgsn.cn
http://BZkxdwKk.Lsgsn.cn
http://m4AANvJo.Lsgsn.cn
http://4MbCyzlh.Lsgsn.cn
http://w8PTysDQ.Lsgsn.cn
http://nbhK93Cw.Lsgsn.cn
http://fdVLc3KM.Lsgsn.cn
http://8SNAxgW3.Lsgsn.cn
http://utverO8u.Lsgsn.cn
http://www.dtcms.com/a/369301.html

相关文章:

  • 【前端教程】JavaScript 实现爱好选择与全选/全不选功能
  • 安全产业 出海行动 | 安贝斯受邀参加第六届非传统安全(杭州)国际论坛:靠近国际前沿 拓宽国际视野
  • Ruoyi-vue-plus-5.x第五篇Spring框架核心技术:5.1 Spring Boot自动配置
  • 一招快速识别你的电脑是机械硬盘还是固态硬盘
  • Centos7中部署Dify
  • 微服务架构下生鲜订单分布式事务解决方案指南
  • 电机试验平台:从实验到应用的创新突破
  • GitHub每日最火火火项目(9.5)
  • 十一、标准化和软件知识产权基础知识
  • B.50.10.07-分布式锁核心原理与电商应用
  • 语音识别系统的技术核心:从声音到文字的智能转换
  • WALLX全球大使圆桌论坛成功举办,13国代表共话未来,超千人共同参与
  • 本地化部署 DeepSeek
  • 开讲啦|MBSE公开课:第五集 MBSE中期设想(下)
  • Axure笔记
  • AMD三箭齐发:MI350已成AI加速器新王牌,256颗GPU的MI500“王炸”已预定2027
  • Docker Registry 实现原理、适用场景、常用操作及搭建详解
  • CAD:绘图功能
  • DeepSeek vs Anthropic:技术路线的正面冲突
  • spring cloud中使用openFeign时候get请求变post解决办法
  • 系统学习算法 专题十八 队列+宽搜
  • 【c++】c++第一课:命名空间
  • Graphpad 绘图(二):小鼠生存曲线绘制与数据记录分析详解
  • DNS基本功能搭建
  • C++Primerplus 编程练习 第十二章
  • 看见世界的另一种可能:Deepoc星眸(StarGaze)如何为视障生活带来曙光
  • Springboot实现国际化(MessageSource)
  • 告别Qt Slider!用纯C++打造更轻量的TpSlider组件
  • 数字孪生赋能:智能制造如何实现从“经验驱动”到“数据驱动”?
  • 穿越市场迷雾:如何在经济周期中保持理性与长期视角