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

Load time, traversal time, memory usage for different data segments C/C++

本文关键字:时间 使用率 内存 数据 遍历 加载      更新时间:2023-10-16

我想进一步了解不同数据段中变量的遍历时间。例如,可以说我们想用100 000 int填充数组。如果数组在堆栈,堆或数据段中,则遍历时间有什么区别?如果我们使用很多更大或较小的数组,这会有任何区别 - 解释:,例如,堆中的遍历时间为100 000 Elemnts 2倍,而对于堆栈中的1倍,如果我们有不同的情况,此比例会相同尺寸(10 000 000(?另外,过程的加载时间和总体内存使用情况有什么区别?谢谢!

编辑:如何在代码中确定这一点?我的意思是 - 是否有任何功能可以计算执行时间,"遍历时间"以及我想找出的其他内容?

要回答您的编辑问题,您可以使用计时器。您在执行代码之前启动计时器并在此之后立即停止。然后减去停止启动以找出椭圆形的时间。

已经在这里回答

内存是内存

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

缓存到救援

话虽如此,这不是整个故事。现代体系结构有缓存。关于缓存的讨论在这里太广泛了,但要旨是缓存较小,更昂贵但更快的记忆"缓存" RAM的数据。因此,在实际情况下,在(时间局部(或附近访问的数据(很可能(将更快地送入CPU,因为它可以在CACHE中使用。

好吧,很好,但是哪个段更快?

通常,我们说堆栈内存比内存更快。就像第1段一样,当我在思考的时候,这让我亲自感到困惑。但是您考虑了第2段,这是有道理的。由于使用模式,堆栈几乎总是在缓存中。

所以...使用堆栈?

不幸的是,它并不那么简单。从来没有,尤其是当您分析低级性能时。堆栈不能很大。有时,即使您可以将数据放在堆栈上,还有其他原因选择将其放在堆上。因此,我很抱歉(不是真的(告诉您,答案从来都不是简单的或黑白的。您实际上可以做的就是 profile 您的应用程序并亲自查看。那相对容易。解释结果并知道如何改善它们是另一只野兽。

如果,例如,堆中的遍历时间为100 000 Elemnts和1倍的堆栈,如果我们有这个比例,如果我们有 不同的尺寸(10 000 000(

即使说,只有堆的性能也不是线性的。为什么?好吧,再次缓存。当访问适合缓存中的内存时,性能效果不错,然后您会看到尖峰,就像数据生长超过缓存(线路(大小一样。在相对较旧的系统上,您有3个不错的区域清楚地界定了与计算机中的3个缓存级别相对应的。当您的数据从安装到更高的水平上,当它完全不适合缓存时,您会看到尖峰。现代处理器具有"智能缓存",它具有一些黑魔法使它看起来更大,因为您有1个大缓存而不是3个级别。