相关疑难解决方法(0)

在Windows Vista和Windows 7上使用HEAP_NO_SERIALIZE使用堆内存函数减少约100倍的原因

我试图追踪Windows Vista和Windows 7中堆内存功能的巨大减速(我没有在任何服务器版本上测试).它根本不会发生在Windows XP上,只发生在微软较新的操作系统上.

我最初使用Windows上的PHP编译遇到了这个问题.脚本本身似乎以预期的速度运行,但在脚本执行后,我在内部PHP关闭功能中遇到了1-2秒的延迟.在启动调试后,我发现它与PHP内存管理器使用HeapAlloc/ HeapFree/有关HeapReAlloc.

我追溯到HEAP_NO_SERIALIZE堆函数上使用标志:

#ifdef ZEND_WIN32
#define ZEND_DO_MALLOC(size) (AG(memory_heap) ? HeapAlloc(AG(memory_heap), HEAP_NO_SERIALIZE, size) : malloc(size))
#define ZEND_DO_FREE(ptr) (AG(memory_heap) ? HeapFree(AG(memory_heap), HEAP_NO_SERIALIZE, ptr) : free(ptr))
#define ZEND_DO_REALLOC(ptr, size) (AG(memory_heap) ? HeapReAlloc(AG(memory_heap), HEAP_NO_SERIALIZE, ptr, size) : realloc(ptr, size))
#else
#define ZEND_DO_MALLOC(size) malloc(size)
#define ZEND_DO_FREE(ptr) free(ptr)
#define ZEND_DO_REALLOC(ptr, size) realloc(ptr, size)
#endif
Run Code Online (Sandbox Code Playgroud)

和(这实际上是设置为默认HeapAlloc/ HeapFree/ HeapReAlloc在函数)start_memory_manager:

#ifdef ZEND_WIN32
    AG(memory_heap) = HeapCreate(HEAP_NO_SERIALIZE, 256*1024, 0);
#endif
Run Code Online (Sandbox Code Playgroud)

我删除了HEAP_NO_SERIALIZE参数(替换为0),它修复了问题.脚本现在可以在CLI和SAPI Apache …

heap winapi memory-management windows-vista windows-7

12
推荐指数
1
解决办法
2997
查看次数