问题标签 [code-size]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2060 浏览

c++ - 编译器优化“不断传播”是什么意思?

来自 Scott Meyers 的 Effective C++:

无论数据存储在哪里,从膨胀的角度来看,关键结果是现在 SquareMatrix 的许多(可能是全部)成员函数可以是对基类版本的简单内联调用,这些版本与所有其他持有相同类型的矩阵的矩阵共享数据,不管它们的大小。同时,不同大小的 SquareMatrix 对象是不同的类型,因此即使 SquareMatrix<double, 5> 和 SquareMatrix<double, 1 0> 对象在 SquareMatrixBase<double> 中使用相同的成员函数,也不可能将 SquareMatrix<double, 5> 对象传递给需要 SquareMatrix<double, 1 0> 的函数。不错,不是吗?

不错,是的,但不是免费的。与将大小作为函数参数传递或存储在对象中的共享版本相比,硬连线到其中的矩阵大小的 invert 版本可能会生成更好的代码。例如,在特定于大小的版本中,大小将是编译时常量,因此有资格进行诸如常量传播之类的优化,包括将它们作为立即操作数折叠到生成的指令中。这不能在与大小无关的版本中完成。

在上一段的上述描述中,它被提及为“因此有资格进行诸如常量传播之类的优化,包括将它们作为直接操作数折叠到生成的指令中”。这个说法是什么意思?请要求解释这一点。

谢谢!

0 投票
17 回答
15211 浏览

c++ - 获取 C++ 函数的大小

我正在阅读这个问题,因为我试图在 C++ 程序中查找函数的大小,暗示可能有一种特定于平台的方法。我的目标平台是 windows

我目前脑海中的方法如下:
1. 获取指向函数
的指针 2. 递增指针(& 计数器)直到达到机器码值ret
3. 计数器将是函数的大小?

Edit1:为了澄清“大小”的含义,我指的是构成函数的字节数(机器代码)。
Edit2:有一些评论询问我为什么或打算用这个做什么。诚实的答案是我无意,而且我看不到知道函数长度预编译时间的好处。(虽然我确定有一些)

这对我来说似乎是一种有效的方法,这行得通吗?

0 投票
2 回答
2489 浏览

iphone - 如何减少 iPhone 应用程序的代码大小?

我的 iPhone 应用程序正准备投入生产,我们希望尽可能多地塞入数据。当我查看为我的应用程序生成的 .app 文件时,我看到一个名为 <executable name> 的文件,我认为它是编译后的代码。大约 2.5 兆,对于我在我的应用程序中包含的内容来说似乎很大。我应该检查什么类型的东西以确保我的可执行文件中没有任何不需要的项目?

0 投票
11 回答
26007 浏览

c++ - 编译> 2 GB的代码时如何修复GCC编译错误?

我有大量的函数,总计大约 2.8 GB 的目标代码(不幸的是,没有办法,科学计算......)

当我尝试链接它们时,我得到(预期的)relocation truncated to fit: R_X86_64_32S错误,我希望通过指定编译器标志来规避这些错误-mcmodel=medium。除了我可以控制之外,所有链接的库都使用该-fpic标志编译。

尽管如此,错误仍然存​​在,我假设我链接到的一些库不是用 PIC 编译的。

这是错误:

我链接的系统库:

在哪里寻找问题的任何线索?

编辑:

首先谢谢大家的讨论。。。

为了澄清一点,我有数百个函数(在单独的目标文件中每个大小约为 1 MB),如下所示:

该对象s相对较小,并保留所需的常量 x14、x15、...、ds0、...等,同时ti仅从外部库返回一个 double。如您所见,csc[]它是一个预先计算的值映射,它也在以下形式的单独对象文件中进行评估(同样数百个,每个大约 1 MB 大小):

就是这样。最后一步只是调用所有这些func[i]并总结结果。

关于这是一个相当特殊和不寻常的情况:是的。这是人们在尝试对粒子物理进行高精度计算时必须应对的问题。

编辑2:

我还应该补充一点,x12、x13 等并不是真正的常数。它们被设置为特定值,运行所有这些函数并返回结果,然后选择一组新的 x12、x13 等来生成下一个值。这必须做 10 5到 10 6次...

编辑3:

感谢您到目前为止的建议和讨论......我会尝试以某种方式在代码生成时滚动循环,说实话,不确定如何做到这一点,但这是最好的选择。

顺便说一句,我并没有试图隐藏“这是科学计算——无法优化”。
只是这段代码的基础是来自一个“黑匣子”的东西,我无法真正访问,而且,整个事情在简单的例子中效果很好,我主要对现实中发生的事情感到不知所措世界应用...

编辑4:

csc因此,通过简化计算机代数系统 ( Mathematica )中的表达式,我设法将定义的代码大小减少了大约四分之一。我现在还看到了一些方法,通过在生成代码之前应用一些其他技巧(这将使这部分减少到大约 100 MB),将它减少另一个数量级左右,我希望这个想法有效。

现在与您的答案有关:

我试图在 s 中再次将循环回滚func,CAS 不会有太大帮助,但我已经有了一些想法。例如,按变量对表达式进行排序,用 Pythonx12, x13,...解析cscs 并生成将它们相互关联的表。然后我至少可以将这些部分生成为循环。由于这似乎是迄今为止最好的解决方案,我将其标记为最佳答案。

但是,我也想感谢 VJo。GCC 4.6 确实工作更好,生成的代码更小并且速度更快。使用大型模型按原样处理代码。所以从技术上讲,这是正确的答案,但改变整个概念是一种更好的方法。

谢谢大家的建议和帮助。如果有人感兴趣,我会在准备好后立即发布最终结果。

评论:

只是对其他一些答案的一些评论:我试图运行的代码并不是源于简单函数/算法的扩展和愚蠢的不必要的展开。实际发生的是,我们开始的东西是非常复杂的数学对象,将它们转化为可数值计算的形式会生成这些表达式。问题实际上在于潜在的物理理论。中间表达式的复杂性是众所周知的,但是当将所有这些东西组合成物理上可测量的东西——一个可观察的——时,它只是归结为只有少数非常小的函数构成了表达式的基础。(在这方面,通用且唯一可用的ansatz肯定存在“错误”这被称为“微扰理论”)我们试图将这个 ansatz 带到另一个层次,这在分析上不再可行,并且所需函数的基础是未知的。所以我们尝试像这样暴力破解它。不是最好的方法,但希望能帮助我们最终理解手头的物理学……

最后编辑:

感谢您的所有建议,我已经设法大大减少了代码大小,使用 Mathematica 并修改了funcs 的代码生成器,有点类似于最佳答案:)

我已经csc使用 Mathematica 简化了函数,将其缩小到 92 MB。这是不可约的部分。第一次尝试花了很长时间,但经过一些优化后,现在在单个 CPU 上运行大约 10 分钟。

funcs 的影响是巨大的:它们的整个代码大小降低到大约 9 MB,因此现在代码总计在 100 MB 范围内。现在打开优化是有意义的,并且执行速度非常快。

再次感谢大家的建议,我学到了很多。

0 投票
3 回答
300 浏览

c++ - 一种解决 Qt 应用程序大小的方法

带有网络库和 GUI 库的 Qt 应用程序大约 10MB;也就是说,没有代码。

对于像我这样有互联网连接的人来说,这有点不方便;特别是对于很少使用的程序(即使用一次然后离开)。

我尝试使用 LZMA 和 LZMA2 压缩来压缩 exe 文件,但它什么也没做。

我想让代码本身更小,有没有办法做到这一点?我可以缩小多少?至少在涉及网络库时。

PS:我不想使用 UPX 或此类应用程序。

0 投票
1 回答
1974 浏览

deployment - 部署中的 Haskell 静态与动态链接

为什么默认不cabal install使用标志--enable-shared?我注意到,在没有此标志的情况下编译的琐碎程序会变得很大文件大小。有联系吗?这是与如何将 Haskell 程序轻松部署在单个独立二进制文件中相关的设计选择吗?

0 投票
4 回答
781 浏览

c++ - 使用内联函数是否与直接在代码中编写函数体一样快?

Foo1()和之间Foo2(),哪一个会更快完成?

0 投票
2 回答
283 浏览

c - C18:未使用的库函数会占用 EPROM 中的空间吗?

图书馆.h

主程序

我有一个库文件,其中包含很多函数定义。由于未使用的库函数,生成的机器代码大小会增加吗?或者编译器会通过忽略那些未使用的函数来优化代码吗?

IDE:MPLAB 8.43
编译器:MCC18 3.34
PIC:18F2550

0 投票
4 回答
355 浏览

c++ - 如果逻辑上是可选的,我应该用 `else { return ... }` 封装最后一个 `return` 语句吗?

哪种格式在速度、性能和机器代码大小方面更好?

最后return是封装的:

最后return没有封装:

0 投票
3 回答
4413 浏览

c++ - 如何衡量代码大小?

当讨论某些特性或优化时,经常会提到代码大小。

虽然我当然了解基本概念,即编译为机器代码的代码集合将产生 X 字节的机器代码(加上静态数据),但我最近意识到我非常不确定如何实际测量代码大小给定的二进制文件。

那么,如何衡量代码大小?

您是否只检查生成的二进制文件(“可执行文件”,)有多大.exe?您是否需要诸如dumpbin.exe或某些特定链接器标志之类的工具来获得详细结果?