|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2024/5/7 14:23:40 |
标题: |
C++ Builder 12.1 Windows 64-Bit (Modern)Release编译的文件体积比Debug还大? |
浏览:772 |
|
加入我的收藏 |
楼主: |
RT,C++ Buidler Windows 64-Bit(Modern)使用新建的VCL空窗体项目,Release编译后有14M多,而Debug编译的只有7M多,差了一倍,怎么回事?Release编译的文件体积一般不是比Debug要小吗? 官方搞反了?
此帖子包含附件:
大小:45.8K |
----------------------------------------------
- |
作者: |
|
2024/5/7 14:42:22 |
1楼: |
我也发现这个问题。原因未知。难道弄反了?
----------------------------------------------
-
|
作者: |
|
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
此帖子包含附件:
大小:176.1K |
----------------------------------------------
-
|
作者: |
|
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
----------------------------------------------
-
|
作者: |
|
2024/5/9 13:23:38 |
8楼: |
我试了c++的modern编译慢,产生文件大,运行效率并不高。 编译最快是经典win32,点一下,就编译完了,但运行效率一般。 win64,我想是用clang,编译后程序运行效率很快了。
----------------------------------------------
-
|
作者: |
|
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 可用字节
----------------------------------------------
-
|
作者: |
|
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不需要实际存在,就可以大幅度降低文件大小。
----------------------------------------------
-
|
作者: |
|
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的还小
----------------------------------------------
-
|
作者: |
|
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开关也算是一种临时处理方法吧。
----------------------------------------------
-
|
作者: |
|
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小。:)
----------------------------------------------
-
|
作者: |
|
2024/5/10 22:09:01 |
16楼: |
64x编译使用了SIMD指令 12楼(为啥显示两个12楼)的测试程序没有发挥出SIMD的优势 反而拖了后腿 另外看反编译的代码 64x确实没有64的代码简洁
----------------------------------------------
-
|
作者: |
|
2024/5/11 10:45:05 |
17楼: |
代码不简洁是因为Clang 9.0-12.0后塞进去了太多东西,LLVM的发展目标已经变了,变成了赶超GCC 推荐一个很好的网站,可以对比各种C++编译器的不同版本生成的代码: https://godbolt.org
此帖子包含附件:
大小:150.7K |
----------------------------------------------
-
|
|