c – Windows 7/64上的VirtualAllocExNuma内存访问时间较慢

在我们的应用程序中,我们运行的是双Xeon服务器,每个处理器的内存配置为12gb,连接两个Xeon的内存总线.出于性能原因,我们希望控制分配大(> 6gb)内存块的位置.以下是简化代码
DWORD processorNumber = GetCurrentProcessorNumber();
UCHAR   nodeNumber = 255;
GetNumaProcessorNode((UCHAR)processorNumber,&nodeNumber );
// get amount of physical memory available of node.
ULONGLONG availableMemory = MAXLONGLONG;
GetNumaAvailableMemoryNode(nodeNumber,&availableMemory )
// make sure that we don't request too much.  Initial limit will be 75% of available memory
_allocateAmt = qMin(requestedMemory,availableMemory * 3 / 4);
// allocate the cached memory region Now.
HANDLE handle = (HANDLE)GetCurrentProcess ();
cacheObject = (char*) VirtualAllocExnuma (handle,_allocateAmt,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE| PAGE_NOCACHE,nodeNumber);

代码原样,在Win 7/64上使用VS2008正常工作.

在我们的应用程序中,这块内存用作静态对象(1-2mb ea)的缓存存储,通常存储在硬盘驱动器上.我的问题是,当我们使用memcpy将数据传输到缓存区域时,它需要>比使用new char [xxxx]分配内存的时间长10倍.没有其他代码更改.

我们无法理解为什么会这样.关于在哪里看的任何建议?

解决方法

PAGE_NOCACHE是perf的谋杀案,它会禁用cpu缓存.这是故意的吗?

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...