问题标签 [memory-optimization]

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 投票
9 回答
1856 浏览

c++ - 每次循环迭代都清理向量。什么是最节省内存的方法?

我对 std::vector 有疑问。

我有一个非常占用内存的算法,我预见到预测向量大小并提前为向量保留足够的内存将对减少内存使用有很大帮助。

以下哪个更好:

或这个:

请告诉我哪个最好,或者是否有更好的做事方式。

非常感谢您!

0 投票
8 回答
5804 浏览

c - C 结构中的自动字段重新排序以避免填充

我花了几分钟手动重新排序结构中的字段以减少填充效果[1],这感觉就像几分钟太多了。我的直觉告诉我,我最好把时间花在编写 Perl 脚本之类的东西上来为我做这种优化。

我的问题是这是否也是多余的;是否已经有一些我不知道的工具,或者我应该能够打开[2] 来打包结构的一些编译器功能?

这个问题更加复杂,因为这需要在几个不同的架构上进行一致的优化,所以无论使用什么工具都需要能够考虑不同的结构对齐和指针大小。

编辑:快速澄清——我想要做的是重新排序源代码中的字段以避免填充,而不是像在没有填充的情况下编译那样“打包”结构。

编辑#2:另一个复杂情况:根据配置,某些数据类型的大小也可能发生变化。显而易见的是针对不同架构的指针和指针差异,还有浮点类型(16、32 或 64 位,取决于“精确度”)、校验和(8 位或 16 位,取决于“速度”)和一些其他不明显的东西。

[1] 有问题的结构在嵌入式设备上被实例化了数千次,因此结构每减少 4 字节可能意味着该项目的成功与否之间差异。

[2] 可用的编译器有 GCC 3.* 和 4.*、Visual Studio、TCC、ARM ADS 1.2、RVCT 3.* 和其他一些比较晦涩的编译器。

0 投票
9 回答
76158 浏览

c# - 减少 .NET 应用程序的内存使用?

有哪些技巧可以减少 .NET 应用程序的内存使用?考虑以下简单的 C# 程序。

在x64的发布模式下编译并在 Visual Studio 外部运行,任务管理器报告以下内容:

如果只为x86编译它会好一点:

然后我尝试了以下程序,它的作用相同,但在运行时初始化后尝试修剪进程大小:

在 Visual Studio 之外的x86 Release上的结果:

哪个好一点,但对于这样一个简单的程序来说,它仍然显得过分。有什么技巧可以让 C# 进程更精简一些吗?我正在编写一个大多数时间都在后台运行的程序。我已经在一个单独的应用程序域中做任何用户界面的东西,这意味着用户界面的东西可以安全地卸载,但是当它只是坐在后台时占用 10 MB 似乎过多。

PS至于我为什么要关心 ---(Power)用户往往会担心这些事情。即使它对性能几乎没有影响,半精通技术的用户(我的目标受众)也倾向于对后台应用程序内存使用大发雷霆。甚至当我看到 Adob​​e Updater 占用 11 MB 内存并被 Foobar2000 的平静触感所抚慰时,我都感到震惊,即使在播放时也可能占用不到 6 MB。我知道在现代操作系统中,这些东西在技术上真的没有那么重要,但这并不意味着它对感知没有影响。

0 投票
1 回答
1014 浏览

php - PHP 内存优化

我正在使用 xdebug 跟踪一些代码以查看它使用了多少内存,但在跟踪开始时,它使用了大约560224字节的内存。这是正常的吗?这是在执行任何代码之前。

编辑: 我应该澄清一下;这不是我要优化的。我只是注意到它并想要一个解释。

0 投票
4 回答
1417 浏览

php - 不同大小的排列

我正在尝试用 PHP 编写一个函数来获取所有可能大小的所有排列。我认为一个例子是最好的开始方式:

不同大小的可能排列:

注意:我不在乎是否有重复。出于本示例的目的,已省略所有未来的重复项。

到目前为止我在 PHP 中所拥有的:

我能想到的最接近的事情是改组数组,挑选前 n 个元素,查看它是否已经在结果数组中,如果不是,将其添加,然后在数学上没有更多可能的排列时停止该长度. 但它丑陋且资源效率低下。

任何伪代码算法将不胜感激。


此外,对于超级骗子(毫无价值)的奖励积分,有没有办法只用函数获得 1 个排列,但让它不必重新计算所有先前的排列来获得下一个排列?

例如,我给它传递了一个参数 3,这意味着它已经完成了 3 次排列,它只是生成数字 4,而不重做前面的 3?(传递参数不是必需的,它可以在全局或静态中跟踪)。

我问这个的原因是因为随着数组的增长,可能的组合数量也在增长。可以这么说,一个只有十几个元素的小数据集迅速增长为数万亿种可能的组合,我不想让 PHP 一次在其内存中保存数万亿个排列。

0 投票
2 回答
3926 浏览

data-structures - 基于磁盘的特里?

我正在尝试在内存容量非常有限的手机上构建Trie 。

我认为最好将整个结构存储在磁盘上,并且只在必要时加载,因为我可以容忍一些磁盘读取。但是,经过几次尝试,这似乎是一件非常复杂的事情。

有哪些方法可以将 Trie 存储在磁盘上(即仅部分加载)并保持快速查找属性?
这甚至是一个好主意吗?

0 投票
6 回答
3395 浏览

python - Python中的内存高效int-int dict

我需要一个 Python 中的内存高效 int-int dict,它可以在O(log n)时间内支持以下操作:

我需要持有约 2.5 亿对,所以它真的必须很紧。

你碰巧知道一个合适的实现(Python 2.7)吗?

编辑删除了不可能的要求和其他废话。谢谢,克雷格和凯洛坦!


改写。这是一个包含 1M 对的普通 int-int 字典:

平均而言,一对整数使用49 个字节

这是一个 2M 整数的数组:

平均而言,一对整数使用8 个字节

我接受字典中的 8 个字节/对通常很难实现。 改写的问题:是否有一个内存有效的 int-int 字典实现,它使用的字节数大大少于 49 个字节/对?

0 投票
6 回答
805 浏览

for-loop - 为什么整数总是用作 for 循环中的控制变量?

很多时候你知道你的循环永远不会运行超过 x 次,其中 x 可以用 byte 或 short 表示,基本上是小于 int 的数据类型。

为什么我们使用 int 占用 32 位(对于大多数语言),而像字节这样的东西只有 8 位就足够了。

我知道我们有 32 位和 64 位进程,因此我们可以轻松地在一次行程中获取值,但它仍然会消耗更多内存。或者我在这里错过了什么?

更新:只是为了澄清。我知道速度方面没有区别。我在问对内存消耗的影响。

0 投票
5 回答
6786 浏览

php - 迭代期间取消设置数组值是否会节省内存?

这是一个简单的编程问题,因为我不了解 PHP 如何在foreach循环期间处理数组复制和取消设置。就像这样,我有一个来自外部源的数组,它以我想要更改的方式格式化。一个简单的例子是:

但我想要的是这样的:

所以我采用第一个$myData并将其格式化为第二个$myData。我对我的格式化算法完全没问题。我的问题在于找到一种节省内存的方法,因为这些数组可能有点笨拙。因此,在我的foreach循环中,我将当前数组值复制到新格式中,然后从原始数组中取消设置我正在使用的值。例如:

这里呼吁unset()一个好主意吗?即,它是否节省内存,因为我已经复制了数据并且不再需要原始值?或者,PHP 是否会自动垃圾收集数据,因为我没有在任何后续代码中引用它?

代码运行良好,到目前为止,我的数据集的大小可以忽略不计,无法测试性能差异。我只是不知道我以后是否要为一些奇怪的错误或 CPU 命中做好准备。

感谢您的任何见解。
-sR

0 投票
3 回答
1554 浏览

memory-management - PHP CLI - 检测我的内存浪费在哪里

我正在为几个 CLI 守护程序使用 PHP + Zend 框架。它们占用了相当多的内存。我假设 Zend Framework 部分可能会导致这种情况,但我希望有事实告诉我内存浪费在哪里。

如何确定内存浪费在哪里?这只是一个试错过程吗?另外,如何改进垃圾收集(我读了一些文章,这也可能是导致大量内存使用的问题)。