如何找出我的 DLL 增长如此之快的原因

Posted

技术标签:

【中文标题】如何找出我的 DLL 增长如此之快的原因【英文标题】:How to find out why my DLL has grown so much 【发布时间】:2011-05-17 18:06:27 【问题描述】:

我一直在处理的一个 DLL 的大小最近增长了很多。是否有任何工具可以告诉我对此负责的原因?例如,它是一个被实例化太多次的模板,还是一个 3rd 方库,或者可能是 boost?

我正在寻找一种关注大小而不是性能的分析器。

【问题讨论】:

好吧,你是建造它的人!为什么需要分析器来查看您自己必须添加的内容? @Neil Butterworth:我正在尝试查看是否有一个特别重的类、模板或函数内联过于激进——我不知道如何通过检查找出这些东西. 你喂它吃什么?他们不是告诉你午夜后店里没有披萨吗? 简单。回到你对大小感到满意的版本控制。那时与现在不同。 【参考方案1】:

您是在谈论 DLL 的大小(以字节为单位)吗?尝试使用 dumpbin 实用程序。这可以向您显示 DLL 中的内容。 /ARCHIVEMEMBERS 应该向您显示各个对象模块。

http://support.microsoft.com/kb/177429

【讨论】:

++ 是的。我要么这样做,要么得到一个地图文件,看看里面有什么。可能不是,因为我声明了一些我实际上并不需要的变量,所以它充满了大块的类库。【参考方案2】:

如果您的 DLL 有其他依赖项并且您正在使用 STATIC 链接将您的 DLL 链接到它们,您可以预期您的 DLL 会变得更大:

Static linking vs dynamic linking

静态链接可以使二进制文件更容易分发到不同的用户环境(代价是发送一个大型且更耗资源的程序)。

编辑:

我发现这个帖子中的答案对您的问题非常有趣:Profiling DLL/LIB Bloat

但一个有趣的实验是验证对于每个模板实例化,生成的可执行文件大小是否线性增长。如果是这样,您就知道您的问题是模板实例化。有一个decent article here 讨论了这类问题并提出了一种重构它的技术。

编辑:

您的问题很可能是使用 boost 标头的结果。检查此线程以找出原因:Why does using boost increase file size so much?

【讨论】:

不幸的是,分发到“不同的用户环境”正是我必须做的。切换到动态链接是我的第一个想法,但由于多种原因立即被排除在外。 @karlphilip 我正在使用 boost 的仅标头部分。 @Pedro 一个有趣的实验是验证对于每个模板实例化,生成的可执行文件大小是否线性增长。 代码项目上有一个不错的页面,名为 Refactoring Template Bloat,如果您发现问题确实是模板实例化,您可能会感兴趣:codeproject.com/KB/cpp/…

以上是关于如何找出我的 DLL 增长如此之快的原因的主要内容,如果未能解决你的问题,请参考以下文章

为何如此之快?ClickHouse的核心特性及架构

为何如此之快?ClickHouse的核心特性及架构

如何应对数字化未来六大发展趋势

应用程序/后端架构:Snapchat 故事如何加载如此之快? [关闭]

数据分析教会我的用户增长,一个月来了1千多人

为什么执行x in range(y)如此之快