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