c++ - 迁移到 64 位操作系统时共享内存性能降低

标签 c++ windows winapi ipc shared-memory

我在 64 位 Windows 上运行 32 位旧版应用程序时遇到问题。相关应用程序使用 CreateFileMapping 创建共享内存。当它在 64 位 Windows 上运行时,从另一个进程访问此共享内存的任何尝试都需要大约 1 秒。共享内存是使用页面保护标志创建的:

flProtect = PAGE_READONLY | SEC_NOCACHE | SEC_COMMIT;

当使用以下方法创建相同的内存时:

flProtect = PAGE_READONLY | SEC_COMMIT;

问题消失了。目前,这种解决方法是可以接受的,但我们确实有一些设备需要设置 SEC_NOCACHE 标志。

有人可以告诉我为什么 SEC_NOCACHE 在这种情况下会影响性能吗?

更新:似乎仅写入此缓冲区的时间已增加到 1000 毫秒。阅读似乎没有受到影响。这次我们正在向缓冲区写入大约 5MB。

Update2:该软件在许多系统上使用,其中一个系统具有需要使用该标志的物理设备。我们目前仅限于在 32 位 Windows 中运行带有此设备的机器。

最佳答案

这就是 Microsoft不得不说一下那个标志:

The SEC_NOCACHE flag is intended for architectures that require various locking structures to be located in memory that is not ever fetched into the CPU cache. On x86 and MIPS machines, use of this flag just slows down the performance because the hardware keeps the cache coherent.

不幸的是,他们没有量化减慢的程度。

关于c++ - 迁移到 64 位操作系统时共享内存性能降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637318/

相关文章:

c++ - mfc c++ 中是否存在用于 URL 编码的 API?

c - 如何在没有 MSYS2 的情况下在 Windows 上构建 GTK+3 程序?

windows - Windows 上的 Emacs

c++ - C++ 流的flush() 和FindFirstFileEx() 之间的竞争条件

Python win32crypt.CryptProtectData 2.5 和 3.1 之间的区别?

c++ - 从文本文件中检测空行

c++ - 从特征匹配/单应性中过滤误报 – OpenCV

c# - Windows 上的 DNS 自定义开发?

windows - Windows 命令行中的 Jasmine

winapi - 需要列表控制 LVM_SETTOPINDEX