问题标签 [memory-profiling]
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.
c++ - 缓存未命中的代价是什么
我正在分析一些代码并使用 cachegrind 来获取执行中的缓存未命中数(L2 和 L3)。
我的问题是如何根据缓存未命中来确定等待缓存准备就绪所花费的时间?
我想说“我的代码得到 90% 的 cpu 利用率”之类的话
是否可以根据缓存研磨输出来执行此操作?
c++ - 是否有任何工具支持基于检查点的 C++ 内存使用分析
我正在开发基于网络的应用程序。我想查看应用程序不同阶段之间的内存使用情况,例如初始化和释放之间的内存使用情况或发送和接收之间的内存使用情况。我已经用谷歌搜索并尝试找到解决方案,但没有完全符合我要求的帖子。
拜托,你们可以建议任何可以帮助我在 Linux 和 Windows 平台上执行基于检查点的内存分析的工具或过程。
提前致谢
以下代码
给我输出
我在 Windows 7 Ultimate 上使用 Visual Studio 2010 Professional。
python - Python 中的内存使用:memory_profiler 和 guppy 有什么区别?
我对特定 python 脚本的内存使用情况感到非常困惑。我想我真的不知道如何描述使用情况,尽管有几个 SO Questions/ Answers的建议。
我的问题是:和有什么区别?为什么一个告诉我我正在使用大量内存,而另一个告诉我我没有?memory_profiler
guppy.hpy
我正在使用pysam
一个用于访问生物信息学 SAM/BAM 文件的库。在将 SAM(ASCII)转换为 BAM(二进制)并在其间操作文件时,我的主脚本很快就会耗尽内存。
我创建了一个小测试示例来了解在每个步骤中分配了多少内存。
使用 memory_profiler ( python -m memory_profiler test_pysam.py
) 监控内存使用情况会产生以下输出:
然后注释掉@profile
装饰器并取消注释guppy
相关行,我得到以下输出(python test_pysam.py
):
第 13 行的总大小在一种情况下为 529.03 MB,在另一种情况下为 624 字节。这里到底发生了什么?'test.sam' 是一个约 52MB 的 SAM(还是 ASCII 格式)文件。深入研究 对我来说有点棘手pysam
,因为它是与samtools
. 不管 aSamfile
实际上是什么,我认为我应该能够了解分配了多少内存来创建它。我应该使用什么程序来正确分析更大、更复杂的 python 程序的每个步骤的内存使用情况?
ruby - Ruby 的 GC.stat 的字段是什么意思?
我GC.stat
用来分析我们的 Rails 应用程序中的内存使用情况。 GC.stat
返回具有以下键的哈希:
有人知道这些值的确切含义吗?在 Ruby 源代码 ( gc.c )中没有关于它们的文档,只有一条评论:“哈希的内容是实现定义的,将来可能会更改。”
其中一些字段在上下文中是有意义的,例如count
Ruby 分配的堆数。但什么是heap_final_num
?是什么heap_increment
?是heap_length
最小堆大小吗?
我在摆弄RUBY_MIN_HEAP_SLOTS
,RUBY_FREE_MIN
和RUBY_GC_MALLOC_LIMIT
,但是更改这些环境变量似乎对:heap_count
or没有任何影响:heap_length
。如果我从根本上增加最小堆槽,我希望它:heap_count
会下降。所以我真的很想知道所有GC.stat
值代表什么!
我正在使用 Ruby 1.9.3。
c++ - 在高性能金融应用程序中缓存
我正在编写一个应用程序,其目的是优化交易策略。为简单起见,仅假设我们有一个交易策略,即“在此处进入”,然后是“在交易中退出”,然后让我们有两个模型:一个说我们应该承担多少风险(如何如果我们站在市场的错误一边,我们会损失多少),另一个说我们应该获得多少利润(即如果市场同意,我们将获得多少利润)。
为简单起见,我将历史已实现交易称为刻度。这意味着,如果我“在第 28 次交易时输入”,这意味着我将在我的数据集中的第 28 次交易时以该交易的价格输入交易。刻度按时间顺序存储在我的数据集中。
现在,想象一下整个数据集的入口策略有 500 个入口。对于每个条目,我可以预先计算确切的条目刻度。我还可以计算每个入口点的退出策略所确定的退出点(同样作为刻度数)。对于每个条目,我还可以预先计算建模的损失和利润以及这些损失或利润会受到打击的刻度。剩下要做的最后一件事是计算首先会发生什么,即退出策略、退出亏损或退出盈利。
因此,我遍历交易数组并计算 exitTick[i] = min(exitTickByStrat[i], exitTickByLoss[i], exitTickByProfit[i])。整个过程非常缓慢(假设我这样做了 100M 次)。我怀疑缓存未命中是罪魁祸首。问题是:这能以某种方式更快吗?我必须遍历 4 个非平凡长度的数组。我提出的一个建议是将数据分组为四个元组,即具有一组结构,例如(entryTick、exitOnStrat、exitOnLoss、exitOnProfit)。由于更好的缓存可预测性,这可能会更快,但我不能肯定地说。为什么我到目前为止还没有测试它是因为检测分析器在某种程度上不适用于我的应用程序的发布二进制文件,而采样分析器在我看来是不可靠的(我已经尝试过英特尔的分析器)。
所以最后的问题是:这个问题可以做得更快吗?使用发布二进制文件进行内存分析的最佳分析器是什么?我在Win7,VS2010上工作。
编辑:非常感谢大家。我试图尽可能地简化我原来的问题,因此造成了混乱。只是为了确保它的可读性 - 目标意味着设想/实现的利润,止损意味着设想/实现的损失。
优化器是蛮力的。所以,我有一些策略设置(例如指标周期等),然后是最小/最大 breakEvenAfter/breakEvenBy,然后是为您提供止损/目标值的公式。这些公式也是优化的对象。因此,我有一个优化结构,如
所以我尽可能地预先计算一些东西,只在需要时计算一些东西。在 30 秒中,计算在 evaluateExitsAndDetermineImprovement() 函数中花费了 25 秒,该函数执行我在原始问题中描述的操作,即选择 min(exitOnPattern、exitOnStop、exitOnTarget)。我需要调用函数 100M 次的原因是因为我有 100M 的所有参数组合。但在最后一个 for 循环中,只有 exitOnStops 数组发生变化。如果有帮助,我可以发布一些代码。我感谢所有的评论!
python - 内存高效的 Python 批处理
问题
我编写了一个小型 python 批处理器,它加载二进制数据、执行 numpy 操作并存储结果。它消耗的内存比它应该消耗的多得多。我查看了类似的堆栈溢出讨论,并想寻求进一步的建议。
背景
我将光谱数据转换为 rgb。光谱数据存储在带线交错 (BIL) 图像文件中。这就是我逐行读取和处理数据的原因。我使用Spectral Python Library读取数据,它返回一个 numpy 数组。hyp是大型光谱文件的描述符:hyp.ncols=1600, hyp.nrows=3430, hyp.nbands=160
代码
内存消耗
所有大数据都在循环外初始化。我天真的解释是内存消耗不应该增加(我使用了太多的 Matlab 吗?)有人可以解释一下增加因子 10 吗?这不是线性的,因为 hyp.nrows = 3430。有什么建议可以改善内存管理吗?
笔记
我用 xrange 替换了range ,没有大幅改进。我知道三次插值并不是最快的,但这与 CPU 消耗无关。
c# - WPF GarbageCollection 中的高级调试建议
情况
我们正在运行一个大型 WPF 应用程序,该应用程序在很长一段时间内都不会释放内存。这不是真正的内存泄漏,因为内存最终会被释放。我知道通常情况下,这不会被认为是一个问题。不幸的是,它与 WPF 命令基础架构一起成为性能问题。有关更详细的说明,请参见下文。
发现
我们有执行典型用例的自动化测试。有些情况下工作正常并及时释放内存。其他人正在占用内存,直到客户端最小化、打开新窗口或发生触发 Gen2 收集的其他情况。
• 在ANTS 中,我们看到对象没有GC Root,但有很多对其他需要终结的对象的引用。
• WinDbg 不显示任何准备完成的对象。
• 运行几个GC.Collect()
,GC.WaitForPendingFinalizers()
完全释放内存。
• 我们知道哪个 UI 操作导致了高内存状况,但我们无法识别任何可疑代码。
问题
我们将不胜感激有关调试此类问题的任何建议。
WPF CommandManager 背景
_requerySuggestedHandlers
WPF CommandManager 拥有用于引发CanExecuteChanged
事件的 WeakReferences ( ) 的私有集合。处理CanExecuteChanged
成本相当高(尤其是为 找到 EventRoute CanExecute
,显然是 a RoutedEvent
)。每当 CommandManager 想要重新查询命令是否可以执行时,它都会遍历此集合并CanExecuteChanged
在相应的命令源上调用事件。
只要有被引用对象的 GC 句柄,WeakReferences 就不会从该集合中删除。虽然尚未收集对象,但 CommandHelper 会继续处理CanExecute
这些元素(ButtonBase 或 MenuItems)的事件。如果有很多垃圾(如我们的例子),这可能会导致大量调用 CanExecute 事件处理程序,从而导致应用程序非常滞后。
windows-mobile - windows mobile 6.0有什么好的内存分析工具吗?
我用谷歌搜索了一下,但找不到任何符合标准的解决方案。然后想到在 StackOverflow 上有一个专门的问题。任何人都有任何想法。
.net - windbg 和 SciTech 分析器:无法为 x64 内存转储加载数据访问 DLL
我知道这已经被问过很多次了,但是我已经阅读了所有这些并且无法解决问题。
基本上,我有一个在 Azure 中作为 Web 角色运行的 IIS 7.0 x64 w3wp.exe 进程的内存转储。我有多个转储,无法在 windbg 或 SciTech .Net Memory Profiler 中加载其中任何一个。对于两者来说,问题似乎都在于找到正确的 mscordacwks.dll。
我已经从机器上获得了 x64 和 x86 mscordacwks.dll,这无法加载它们中的任何一个。
因此,当我想在 windbg 中查看托管线程等时,我会遇到熟悉的错误:
所以我在这里看到了两个奇怪的地方:
- Windows 部署在 Azure 上的 D:\ 驱动器上(这会导致问题吗?)
- CLR 版本:4.0.30319。551但 SOS 版本:4.0.30319。17929
那么它可能是17929的 SOS 版本吗?服务器上的 mscordacwks.dll 肯定是551。
在没有解决问题的情况下,我已经运行了你能想象到的每一个命令行。
提前致谢
profiling - 使用 jvisualvm 进行内存采样
我正在使用 Java Visual VM 的内存采样功能,但无法回答以下问题:
为什么会创建这么多实例?
为什么这些实例和字节数不断增加?
例如,我创建了一个非常简单的 Java 程序,如下所示:
我可以在 Java Visual VM 中看到有 611 个类。实例数量不断从 25,000 增加到接近 50,000,然后回落到 25,000 左右。实例减少的原因可能是由 GC 引起的,但我不知道为什么这些数字如此动态,即使我没有对我的程序做任何事情。