DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maxding
今日帖子: 36
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bewaar (Bewaar) ★☆☆☆☆ -
普通会员
2024/5/7 14:23:40
标题:
C++ Builder 12.1 Windows 64-Bit (Modern)Release编译的文件体积比Debug还大? 浏览:1241
加入我的收藏
楼主: RT,C++ Buidler Windows 64-Bit(Modern)使用新建的VCL空窗体项目,Release编译后有14M多,而Debug编译的只有7M多,差了一倍,怎么回事?Release编译的文件体积一般不是比Debug要小吗?
官方搞反了?
此帖子包含附件:
PNG 图像
大小:45.8K
----------------------------------------------
-
作者:
男 hz_2009 (盒子) ★☆☆☆☆ -
普通会员
2024/5/7 14:42:22
1楼: 我也发现这个问题。原因未知。难道弄反了?
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/5/7 15:57:04
2楼: 其实应该是差不多大小的
现在的BCC64X还有很多问题,根本没做一点优化
自己动手丰衣足食,可以在Release版自己加上-O3等开关(Link高级选项:-flto -Wl,-O3等),激进一点的,再加上-ffunction-sections和-fdata-sections和-Wl,--gc-sections;去除目标文件里没用的段
----------------------------------------------
-
作者:
男 oyefer (oyefer) ★☆☆☆☆ -
盒子活跃会员
2024/5/8 10:57:36
3楼: 确实奇怪,Release版加上2楼说的各种优化选项,最终大小居然还是比Debug默认编译输出的bin文件大。
----------------------------------------------
-
作者:
男 hectic (村雨Hectic) ▲▲▲▲▲ -
普通会员
2024/5/8 17:53:03
4楼: 12.1 patch1 测试,的确release比debug大了几乎一倍,很奇怪。
----------------------------------------------
-
作者:
男 hectic (村雨Hectic) ▲▲▲▲▲ -
普通会员
2024/5/8 21:47:57
5楼: 我用这个帖子的例子做了测试

https://bbs.2ccc.com/topic.asp?topicid=681941

英巴卡没有搞反,release比debug快了9倍以上,并且relese的测试成绩

的确符合上面这个测试帖子里2楼和16楼的c++的成绩。

但是很奇怪,release的exe确尺寸更大。

测试环境12.1 patch1
此帖子包含附件:
JPEG 图像
大小:176.1K
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2024/5/9 0:33:51
6楼: 下个版本一定解决,担什么心
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2024/5/9 11:00:49
7楼: 可能是 release 的 inline 展开(不展开 debug 下更好调试,类似的还有泛型等),以及更优的代码(量也更大)所致?

建议有条件的可以 ida 对比下,如 debug vs release,12 vs 12.1
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2024/5/9 13:23:38
8楼: 我试了c++的modern编译慢,产生文件大,运行效率并不高。
编译最快是经典win32,点一下,就编译完了,但运行效率一般。
win64,我想是用clang,编译后程序运行效率很快了。
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/5/10 8:16:07
9楼: 编译慢很正常,C++编译器的进化方向就是编译时间越来越长,因为C++14以后加了太多的语法糖,很多代码都会在编译时就进行检查和优化,特别是模版元编程和采用了LTO方式,这样运行时效率会高很多。

但BCC64X确实不太正常,对比标准的Clang 15.0.7的编译结果:

D:\Projects>clang -v
clang version 15.0.7
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: D:/Soft/DevTools/LLVM/llvm-mingw/llvm-mingw-1507-ucrt_x86_64/bin

D:\Projects>clang++ -g hello.cpp -o hello.exe

D:\Projects>dir hello.exe
 驱动器 D 中的卷没有标签。
 卷的序列号是 3295-D161

 D:\Projects 的目录

2024-05-10  07:48          150,016 hello.exe
          1 个文件        150,016 字节
          0 个目录 13,797,928,960 可用字节

D:\Projects>clang++ -O2 hello.cpp -o hello.exe

D:\Projects>dir hello.exe
 驱动器 D 中的卷没有标签。
 卷的序列号是 3295-D161

 D:\Projects 的目录

2024-05-10  07:48          80,384 hello.exe
          1 个文件         80,384 字节
          0 个目录 13,797,998,592 可用字节
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/5/10 8:47:32
10楼: 奇怪的是BCC64X的编译阶段还正常,生成的目标文件尺寸也符合预计:
D:\Projects>bcc64x -g -c hello.cpp -o hello1.o
D:\Projects>bcc64x -O2 -c hello.cpp -o hello2.o
D:\Projects>dir hello1.o hello2.o
 驱动器 D 中的卷没有标签。
 卷的序列号是 3295-D161

 D:\Projects 的目录

2024-05-10  08:24          107,371 hello1.o

 D:\Projects 的目录

2024-05-10  08:25          5,486 hello2.o
          2 个文件        112,857 字节
          0 个目录 13,797,101,568 可用字节

但链接生成可执行文件以后Release版的尺寸就莫名其妙的膨胀了:
D:\Projects>ld.lld.exe -m i386pep -Bstatic hello1.o -pdb hello1.pdb -o hello1.exe "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crt2.o" "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crtbegin.o" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\mingw\\lib" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\lib\\clang\\15.0.7\\lib\\windows" -l:import64.lib -lc++ -lmingw32 -lunwind -lmoldname -lmingwex -lucrt -ladvapi32 -lshell32 -luser32 -lkernel32 "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\lib\\clang\\15.0.7\\lib\\windows\\libclang_rt.builtins-x86_64.a" "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crtend.o"

D:\Projects>ld.lld.exe -m i386pep -Bstatic hello2.o -o hello2.exe "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crt2.o" "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crtbegin.o" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\mingw\\lib" "-LC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\lib\\clang\\15.0.7\\lib\\windows" -l:import64.lib -lc++ -lmingw32 -lunwind -lmoldname -lmingwex -lucrt -ladvapi32 -lshell32 -luser32 -lkernel32 "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\lib\\clang\\15.0.7\\lib\\windows\\libclang_rt.builtins-x86_64.a" "C:\\Program Files (x86)\\Embarcadero\\Studio\\23.0\\x86_64-w64-mingw32\\lib\\crtend.o"

D:\Projects>dir hello1.exe hello2.exe
 驱动器 D 中的卷没有标签。
 卷的序列号是 3295-D161

 D:\Projects 的目录

2024-05-10  08:43          700,416 hello1.exe

 D:\Projects 的目录

2024-05-10  08:44         1,014,784 hello2.exe
libc++和libunwind改成动态链接,结果也一样。
----------------------------------------------
-
作者:
男 oyefer (oyefer) ★☆☆☆☆ -
盒子活跃会员
2024/5/10 9:13:05
11楼: 链接工具对pdb参数处理可能存在bug,在Release版的链接高级参数里加上-pdb null.pdb,这里的null.pdb不需要实际存在,就可以大幅度降低文件大小。
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/5/10 9:39:50
12楼: -pdb意思是链接时把调试信息放到pdb文件里,可执行文件的尺寸就变小了
楼上可以试试,会发现本来null.pdb尺寸是0,执行链接后尺寸会变大因为里边有内容

改成一样的链接参数,都不加-pdb,相当于把调试信息放到可执行文件自身(Release的调试信息-O2后应该本来就没有了):
D:\Projects>dir hello1.exe hello2.exe
 驱动器 D 中的卷没有标签。
 卷的序列号是 3295-D161

 D:\Projects 的目录

2024-05-10  09:28         1,021,952 hello1.exe

 D:\Projects 的目录

2024-05-10  09:29         1,014,784 hello2.exe

结论是BCC64X没问题,Debug版本把调试信息另外放到pdb文件了,所以可执行文件尺寸变小了,比release的还小
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2024/5/10 9:50:39
12楼: 1、试了11楼说的,确实文件减少了很多,我的简单例程的exe由14兆减少到7兆。

2、开了o2,但程序的win64x运行效率还是低,要比win64慢很多
https://bbs.2ccc.com/topic.asp?topicid=672504
测这段代码,一次循环,win64x要0.95毫秒,win64要0.58毫秒,delphi 的0.68毫秒,

我觉得估计win64x还有参数不对。
这版的c++的win64进步了,和vc++一样速度,要比delphi编译后效率高。
----------------------------------------------
-
作者:
男 oyefer (oyefer) ★☆☆☆☆ -
盒子活跃会员
2024/5/10 10:10:52
13楼: 感谢你的提示。
链接器ld对调试信息的处理有问题,理论上release版不应该有这么多的调试信息,所以调试信息放哪儿应该影响都不大。
我也试着将Full Debug Information开关打开或关闭,不管Debug版还是Release版最终文件大小居然没变化。我猜测链接器没有理会这个开关,都加上了全部调试信息。Debug版默认将调试信息放到外部pdb文件,而Release版放在自身了。
Release版本来并不需要这些调试信息,所以手动加上-pdb开关也算是一种临时处理方法吧。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/5/10 10:57:50
14楼: 这不奇怪的,-O3搞了很多循环展开的操作,体积比-O0大很正常, release可能链接的库都是-O3编译的,导致整体比-O0的debug库要大也不奇怪

调试信息有可能是存放到EXE外了所以不占体积
----------------------------------------------
-
作者:
男 oyefer (oyefer) ★☆☆☆☆ -
盒子活跃会员
2024/5/10 12:05:29
15楼: 如果这不奇怪,那win32版和win64版就奇怪了,Release体积居然比Debug小。:)
----------------------------------------------
-
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/5/10 22:09:01
16楼: 64x编译使用了SIMD指令
12楼(为啥显示两个12楼)的测试程序没有发挥出SIMD的优势
反而拖了后腿
另外看反编译的代码
64x确实没有64的代码简洁
----------------------------------------------
-
作者:
男 tony2u (tony2u) ★☆☆☆☆ -
普通会员
2024/5/11 10:45:05
17楼: 代码不简洁是因为Clang 9.0-12.0后塞进去了太多东西,LLVM的发展目标已经变了,变成了赶超GCC
推荐一个很好的网站,可以对比各种C++编译器的不同版本生成的代码:
https://godbolt.org
此帖子包含附件:
PNG 图像
大小:150.7K
----------------------------------------------
-
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/6/6 9:41:27
18楼: 今天试用了一下11楼的方法
release模式
加上-pdb null.pdb
exe由22M减至14M
但如果用IDA反编译
会发现所有的函数名(包括自定义的)都显示出来了
如果不加-pdf
IDA中则不会显示函数名
但用16进制编辑器查看exe还是能找到
不知该如何解决这问题
----------------------------------------------
-
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/6/6 13:15:41
19楼: 知道为啥ida会显示函数名了
加上-pdb null.pdb后
null.pdb的路径名被写进了exe文件
所以在同一台电脑上
不管exe放哪儿
ida都能读到它
----------------------------------------------
-
作者:
男 ereere (ereere) ★☆☆☆☆ -
普通会员
2024/6/9 20:42:20
20楼: 应该是 nul.pdb 吧,null多了个字符。
----------------------------------------------
-
作者:
男 board4all (搬运) ▲▲▲▲▲ -
普通会员
2024/6/10 20:06:09
21楼: 我的猜测:
Debug编译的程序仅X64,不带FPU,不带SIMD,不带GPU等优化
Release编译的程序包含各种情况优化的代码?根据硬件的区别调用不同的优化的代码。所以Release比较体积比较大
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2024/6/10 20:29:05
22楼: 体积和效率成正比吗?
体积越小越快.?
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/6/11 9:47:16
23楼:
我的猜测:
Debug编译的程序仅X64,不带FPU,不带SIMD,不带GPU等优化
Release编译的程序包含各种情况优化的代码?根据硬件的区别调用不同的优化的代码。所以Release比较体积比较大


不是的
不加参数的Release
exe把调试信息放进去了
我手工把这段删除
体积就和加参数的一样大
程序能正常运行
----------------------------------------------
-
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/6/11 9:50:10
24楼:
应该是 nul.pdb 吧,null多了个字符。


确实这样
改nul.pdb
就没调试文件生成了
pdb路径名还是会写进exe
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 19:30:52
25楼: 没懂 nul.pdb 和 null.pdb 的区别是什么?
----------------------------------------------
只有偏执狂才能生存!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS