是否有一个"大小功能分析器"了吗?
题
经过三年的工作C++项目,执行已经增长到4兆。我想看看所有这种空间是怎么回事。是有一个工具,可以报告的最大空间的猪是什么?它将很高兴看到大小的类(所有功能在一个类),通过模板(所有实例),并由图书馆(多少属于C的标准图书馆和STL?有多少为每个图书馆在exe?)
编辑:注意,我使用的视觉C++在窗。
解决方案
在Linux, 你可以使用 nm
来显示所有的符号在可执行,并对它们进行排序相反的顺序通过的大小:
$ nm -CSr --size-sort <exe>
选项:
-C
demangles C++的名字。-S
显示了大小的符号。--size-sort
各种各样的符号的大小。-r
反转的排序。
如果你想要得到的结果,每名字空间或每类,你可以 grep
出于'namespace::
', 'namespace::class_name::
', 等等。.
如果你只想看到的符号的定义 在 可执行的(不是定义的其他地方,如在图书馆),然后添加 --defined-only
.按尺寸应该照顾这一点,虽然,由于不确定的符号是不会有大小。
For Windows, ,你应该仍然可以使用 nm
在你的二进制文件,因为 nm
支持 。 二进制文件。你可以安装 nm
通过cygwin,或者你可以复制你的窗户可执行的一个linux箱和运行 nm
在它那里。
你也可以试试 dumpbin
, ,其中转储信息的一个二元的窗口。你可以得到信息上的符号 /SYMBOLS
开关,但是它看起来并不像它直接提供的信息有关它们的大小。
其他提示
在Windows环境下Visual Studio中编译,这些信息是在您的.MAP文件(这将是近.PDB)。
ADDED :要在.MAP文件中找到的装饰名称转换为更多的东西可读的,你可以使用的 undname.exe 效用随Visual Studio。它在命令行上接受个人姓名或可以给它一个.map文件。
例如,
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@Z" is
"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)"
我不能 nm
为我工作,但没有找到一个有用的工具,称为 Sizer.它读出"调试"的信息创建的Visual Studio使用"调试"口访问图书馆。这是很简单的使用,为描述网站上。
- Compile with debugging信息的程序的数据库(.pdb)的文件
- 运行sizer从命令行,例如
Sizer.exe <path-to-exe-file>
.输出去stdout所以你可能会想要重新定向到的文件。
代码尺寸分在不同的部分和按功能、数据、阶级、等等,每个部分按降序排序的代码尺寸。
不要只看码 - 资源很容易造成多兆字节的增长
得到一个链接地图,或者使用 dumpbin
得到一个列表中符号和尺寸。
机会是有很多东西被拉在这你不严格需要的。
添加:你有没有得到令人满意的答案吗?我意识到有两种方法的人的方法问题这样的:
- 得到测量,之前他们做任何事情。
- 只要找到一件大事,他们不需要,把它撕了,重复,直到他们不能。
我个人喜欢的后它得到的结果更快。
你说的应用程序是4M.假设真有必要的大小为1MB(或一些这样大小)。这意味着,如果你选择一个例行程序随意从地图文件,75%可能是被什么东西你不需要。找出是什么导致它被包括在内,并看看如果你真的需要它。
在例您了,您看见的一类包装的设备-独立-位图。你可以找到该类的实例在应用,并有可能替换他们的基本WIN32位图。它就会少很漂亮,但是,保存大量的应用程序的大小。
然后继续这样做。每个大块你摆脱的使其余部分采取更大比例的程序,因为该程序已经缩小,但该件没有。这使得他们更容易找到的地图文件。