x64免费版上的性能缓慢
Slow performance on x64 free
我有一个这样的类(假设所有malloc的继任者(
class CMyClass
{
public:
CMyClass()
{
lpData = malloc(128);
};
~CMyClass()
{
free(lpData);
};
public:
LPVOID lpData;
};
然后我执行这个:
CMyClass *lpList = new CMyClass[32768];
delete [] lpList;
问题是,在x86中,代码运行良好且快速(在调试和发布版本中需要几毫秒才能完成(,但在x64中,删除调用需要大约15秒才能释放所有内存。
O.S.是Win7 x64。
如有提示,我们将不胜感激。
谨致问候,毛罗。
如果您通过调试器运行测试应用程序,则Windows调试堆可能会遇到一些性能问题。将_NO_DEBUG_HEAP=1
添加到被调试对象的环境设置中(在Visual Studio 20xx下的项目属性->配置属性->调试->环境属性中(,看看这是否会提高您的解除分配性能。
我刚刚在Debian上使用gcc 4.6.1-1(添加typedef void *LPVOID
后(测试了这一点。没有区别;两者都立即执行,即使没有任何优化打开。
我将数组长度增加到1048576,以获得可测量的运行时间(0.161s(,这对于IA32和AMD64都是相同的。我打开了优化(-O3(,时间保持不变,但减少到0.157s。-Os(针对大小进行优化(得到了相同的结果。
是否可能使用了不同的构建选项,比如在AMD64上启用了某种内存访问调试?
您要么错误诊断了问题,要么打开了一些堆检查。如果每个malloc/free都调用VirtualAlloc/VirtualFree,我会认为性能会很差,如果是这样的话,您在某个地方启用了内存调试。
您是否尝试分析这两个版本以查看是否有明显的内容?示例中的尺寸是实际尺寸吗?我最初的猜测是,64位版本需要(大量(内存,并导致操作系统崩溃,这将大大降低性能。
我在x64 Windows 7 SP1、x64 Release build、VC10、SP1上运行了相同的代码。x86和x64的执行方式完全相同。
也许你错过了什么。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 缓慢提升ASIO
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- 如何修复macOS线程互斥锁性能缓慢的问题?
- F#性能:是什么让这个代码如此缓慢
- C 11多线程在神经网络中的性能非常缓慢
- QTableView 在 1000 个可见单元格下性能缓慢
- 堆阵列性能缓慢
- 此std::矢量分区的性能缓慢
- x64免费版上的性能缓慢