我使用Marshal.AllocHGlobal
在我的C#应用程序(在Windows中)中分配几个非常大的块(每个100MB)非托管内存。我使用这些来分配较小的非托管内存。在对这些较小的分配进行基准测试后,我认识到虽然超过99%的分配成本为0-10 C#StopWatch
滴答,但有些成本为30分钟到120分钟,我可以将成本追逐到单个memset
个呼叫(150个)字节)。我将memset
调用替换为对memset
将触及的内存区域中的地址进行两次内存写入,并观察到相同的成本。这意味着我的内存访问成本比主内存访问的成本高出1000倍。由于页面错误似乎有类似的成本,我想知道页面错误是否会导致这种行为,但是看看Windows任务管理器,当问题发生时,我远离主要的内存容量。
我试图在微基准测试中重现这一点而没有任何成功。有没有人知道什么可能导致这种行为或我可以做些什么来追逐它?