首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的内存基准测试结果很奇怪?

问为什么我的内存基准测试结果很奇怪?
EN

Stack Overflow用户
提问于 2016-03-14 02:42:52
回答 1查看 104关注 0票数 8

我最近运行了一些用C#编写的基本基准测试,试图确定为什么一些看似相同的HyperV远程工作站的运行速度似乎比其他工作站慢得多。它们在我正在运行的大多数基本测试中的结果都是完全相同的,但来自基本内存访问基准测试的结果(具体而言,将一个二维1000x1000双精度数组初始化为0所需的时间)相差40倍。

在数组大小呈指数级增长的情况下运行相同的测试(直到发生OutOfMemoryException为止),结果显示,在数组大小超过1m之前,不同的遥控器之间没有差异,然后立即相差约为40倍。事实上,测试增量数组大小,初始化所需的时间与数组大小成比例增加,直到数组大小恰好为999999,然后在“慢”遥控器上,所用时间增加了900%,而在“快”遥控器上,当数组大小达到1000x1000时,时间减少了70%。同样的现象也发生在数组大小为1m x 1和1 x 1m时,但幅度要小得多(变化为+50%和-30%。

有趣的是,将用于实验的数据类型更改为浮点数似乎可以完全消除这种现象。在任何测试中,遥控器之间都没有区别,即使在1000*1000和2000*2000断点上,花费的时间似乎也是完全成比例的。另一个有趣的因素是,我使用的本地工作站的行为似乎反映了较慢的遥控器的行为。

有没有人知道系统配置中的哪些设置可能会导致这种影响,以及如何更改它,或者可以执行哪些操作来进一步调试该问题?

EN

回答 1

Stack Overflow用户

发布于 2016-03-14 18:21:29

你必须牢记你真正测试的是什么。这肯定不是.NET程序的赋值数组元素的能力。这是非常快的,通常是大阵列的内存总线带宽,通常约为37 GB/秒,取决于机器的RAM类型,5 GB/秒是您今天可能遇到的最常见的类型(旧机器上的慢时钟DDR2 )。

new关键字只在按需分页的虚拟内存操作系统上分配地址空间。只将数字发送到处理器,每4096字节一个。

一旦您第一次开始分配元素,请求分页功能就会生效,并且您的代码会强制操作系统为数组分配RAM。数组元素赋值触发一个页错误,数组中每4096个字节都有一个错误。或者你的数组的512倍。处理页面错误的成本包含在您的测量值中。

只有当操作系统有一个零初始化的RAM页可以使用时,这才是顺畅的。通常需要半微秒左右的时间。对于处理器来说还有很长一段时间,当操作系统更新页面映射时,它将会停止。请记住,这只在第一次元素访问时发生,随后的访问速度很快,因为RAM页仍然可用。通常是这样。

当这样的RAM页不可用时,情况并不是一帆风顺的。然后操作系统必须掠夺一个。在你的案例中,我能想到多达4种不同的情况:

  • a页可用,但尚未由低优先级零页线程进行零初始化。
  • 一个页面需要从另一个进程中窃取,并且该页面的内容不需要被保留。例如,对于以前包含代码的页面,会发生这种情况。
  • 一个页面需要被盗,它的内容需要保存在分页文件中。例如,对于以前包含数据的页面,会发生这种情况。一个硬性的页面错误,这一点很伤人。当磁盘写入将place.
  • specific带到您的场景中时,处理器将停止,HyperV管理器决定是时候从主机操作系统借用更多的内存了。前面的所有要点都适用于该操作系统,外加操作系统交互的开销。不知道这需要多少开销,这也应该是痛苦的。

你会击中哪一颗子弹,这是非常,非常不可预测的。最重要的是,这不仅仅是因为它涉及到你的程序,在机器上运行的任何其他东西也会影响它。还有一个内存效应,就像在开始测试之前写一个大文件会有一个严重的副作用,这是由等待磁盘的文件系统缓存使用的RAM页引起的。或具有分配突发并排空零页面队列的另一进程。或者内存总线变得饱和,这很容易做到,也可能受到主机操作系统的影响。等等。

简而言之,分析这段代码并不是很有意义。任何事情都会发生,而且你没有一个合适的方法来预测它会发生。或者是一个很好的方法来解决这个问题,而不是让虚拟机占用大量的RAM,而不是在上面运行任何其他东西:)分析第二次通过阵列的结果将更加稳定和有意义,现在不再涉及操作系统。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35974225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档