加载时间,遍历时间,不同数据段C / C ++的内存使用情况

时间:2017-04-24 13:08:24

标签: c++ c

我想更多地了解不同数据段中变量的遍历时间。例如,假设我们想用100 000整数填充数组。如果数组在堆栈,堆中或数据段中,那么遍历时间会有什么不同?如果我们使用更大或更多更小的阵列会有什么不同吗 - 解释:如果,例如堆中的遍历时间是10 000个元素的2倍和堆栈的1倍,如果我们有不同的话,这个比例是相同的规模(10 000 000)?此外,进程的加载时间和总内存使用量会有什么不同?谢谢!

编辑:我如何在代码中确定这一点?这是什么意思 - 是否有任何函数来计算执行时间,“遍历时间”以及我想要找到的其他事情?

2 个答案:

答案 0 :(得分:-1)

记忆是记忆

我的意思是:不同的段(堆栈,堆等)没有物理上不同的记忆。此外,内存是随机存取存储器。 RAM存储器的一个属性是访问数据需要相同的时间,无论数据在芯片上的物理位置或先前访问的位置(与此磁带存储器甚至硬盘对比)。因此,无论我们是在谈论堆还是堆栈还是其他任何东西,对RAM的访问都是无差别的。

缓存到救援

话虽如此,那不是全部故事。现代架构有缓存。关于缓存的讨论在这里过于宽泛,但要点是缓存更小,更昂贵,但更快的内存“缓存”来自RAM的数据。因此,在实际场景中,之前访问的数据(时间局部性)或接近先前访问的数据(空间局部性)将(很可能)更快地馈送到CPU,因为它在缓存中可用。

好的,这很好,但哪个段更快?

根据经验,一般来说,我们说堆栈内存比堆内存快。当我在第1段中思考时,这让我个人感到困惑。但是你考虑到第2段是有道理的。由于使用模式,堆栈几乎总是在缓存中。

所以...使用堆栈?

不幸的是,它并不那么简单。它永远不会,特别是在分析低级别性能时。堆栈不能很大。有时,即使您可以将数据放在堆栈上,还有其他原因可以将它放在堆上。所以,我很抱歉(不是真的)告诉你答案从来都不简单或黑白。你几乎可以做的就是描述你的应用程序,并亲自看看。这相对容易。解释结果并知道如何改进它们就是另一个野兽。

  

例如,如果堆中的遍历时间是100x的2倍   如果我们有,那么这个比例是相同的   不同规模(10 000 000)

即使我们说堆只有性能不是线性的。为什么?好吧,再次缓存。当访问适合缓存的内存时,性能会很好,然后就会在数据增长超出缓存(行)大小时看到峰值。在相对较旧的系统上,您有3个漂亮的区域,这些区域明确分隔,对应于计算机中的3个缓存级别。你看到一个尖峰,因为你的数据从一个级别适应到更高级别的拟合,当它完全不适合缓存时,它就会下降。现代处理器具有“智能缓存”,由于你拥有1个大缓存而不是3个级别,所以它具有一些黑魔法,因此看起来更多。

答案 1 :(得分:-2)

要回答您编辑的问题,您可以使用计时器。在执行代码之前启动计时器并在之后立即停止。然后减去Stop-Start以找出经过的时间..

已经回答here