我有一个这样的类(假设所有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。
提示将不胜感激。
此致 莫罗。
答案 0 :(得分:7)
如果您通过调试器运行测试应用程序,可能会遇到Windows调试堆的某些性能问题。将_NO_DEBUG_HEAP=1
添加到调试对象的环境设置中(在Visual Studio 20xx下的Project Properties-> Configuration Properties-> Debugging-> Environment属性中),看看是否可以改善你的释放性能。
答案 1 :(得分:1)
我刚刚在Debian上使用gcc 4.6.1-1(在添加typedef void *LPVOID
之后)对此进行了测试。没有区别;即使没有打开任何优化,它们也会立即执行。
我将数组长度增加到1048576以获得可测量的运行时间(0.161s),这对于IA32和AMD64都是相同的。我开启优化(-O3),时间保持不变,但减少到0.157秒。 -Os(针对大小进行优化)具有相同的结果。
您是否可以使用不同的构建选项,例如,您可能在AMD64上启用了某种内存访问调试?
答案 2 :(得分:1)
您要么误解了问题,要么开启了一些堆检查。如果每个malloc / free都称为VirtualAlloc / VirtualFree,我会期待如此糟糕的性能,如果是这样的话,你已经在某处启用了内存调试。
答案 3 :(得分:0)
您是否尝试分析两个版本以查看是否有任何明显的内容?示例中的尺寸是实际尺寸吗?我最初的猜测是,64位版本需要(很多)更多的内存并导致操作系统崩溃,这会大大降低性能。
答案 4 :(得分:0)
我在x64 Windows 7 SP1,x64 Release build,VC10,SP1上运行了相同的代码。 x86和x64的执行方式完全相同。
愿你遗失一些东西。