我正在将我的应用程序从Windows 7迁移到Windows 10 所有功能都没有任何变化,但执行时间比Windows 7慢 对象构造/破坏似乎很慢。然后我创造了简单 有关malloc()和free()的基准程序,如下所示。
for (int i = 0; i < 100; i++)
{
QueryPerformanceCounter(&gStart);
p = malloc(size);
free(p);
QueryPerformanceCounter(&gEnd);
printf("%d, %g\n", i, gEnd.QuadPart-gStart.QuadPart);
if (p == NULL)
printf("ERROR\n", size);
}
我在同一台PC上的Windows 7和Windows 10中运行了这个程序。
当数据大小为1,100,1000,10000,100000,1000000,10000000和100000000字节时,我测量了malloc()和free()性能。
在所有上述情况下,窗口10比窗口7慢。
特别是,当数据大小为10000000和100000000时,窗口10的速度超过十倍窗口7。
当数据大小为10000000字节时
当数据大小为100000000字节时
您有什么建议可以在Windows 10上进行改进吗?
我在Windows 10中尝试了以下内容,但遗憾的是性能没有得到改善。
这是源代码。 (2月15日更新)
#include "stdafx.h"
#define START_TIME QueryPerformanceCounter(&gStart);
#define END_TIME QueryPerformanceCounter(&gEnd);
#define PRT_FMT(fmt, ...) printf(fmt, __VA_ARGS__);
#define PRT_TITLE(fmt, ...) printf(fmt, __VA_ARGS__); gTotal.QuadPart = 0;
#define PRT_RESULT printf(",%d", gEnd.QuadPart-gStart.QuadPart); gTotal.QuadPart+=(gEnd.QuadPart-gStart.QuadPart);
#define PRT_END printf("\n");
//#define PRT_END printf(",total,%d,%d\n", gTotal.QuadPart, gTotal.QuadPart*1000000/gFreq.QuadPart);
LARGE_INTEGER gStart;
LARGE_INTEGER gEnd;
LARGE_INTEGER gTotal;
LARGE_INTEGER gFreq;
void
t_Empty()
{
PRT_TITLE("02_Empty");
START_TIME
END_TIME; PRT_RESULT
PRT_END
}
void
t_Sleep1234()
{
PRT_TITLE("01_Sleep1234");
START_TIME
Sleep(1234);
END_TIME; PRT_RESULT
PRT_END
}
void*
t_Malloc_Free(size_t size)
{
void* pVoid;
PRT_TITLE("Malloc_Free_%d", size);
for(int i=0; i<100; i++)
{
START_TIME
pVoid = malloc(size);
free(pVoid);
END_TIME; PRT_RESULT
if(pVoid == NULL)
{
PRT_FMT("ERROR size(%d)", size);
}
}
PRT_END
return pVoid;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
QueryPerformanceFrequency(&gFreq);
PRT_FMT("00_QueryPerformanceFrequency, %lld\n", gFreq.QuadPart);
t_Empty();
t_Sleep1234();
for(i=0; i<10; i++)
{
t_Malloc_Free(1);
t_Malloc_Free(100);
t_Malloc_Free(1000); //1KB
t_Malloc_Free(10000);
t_Malloc_Free(100000);
t_Malloc_Free(1000000); //1MB
t_Malloc_Free(10000000); //10MB
t_Malloc_Free(100000000); //100MB
}
return 0;
}
导致我的环境(由VS2010和Windows 7构建) 在100MB的情况下:
Windows 7中的QPC计数:11.52(4.03usec)
Windows 10中的QPC计数:973.28(341毫秒)
答案 0 :(得分:6)
可能会产生一些影响的一点是,QueryPerformanceCounter
API的内部显然已从Windows 7更改为Windows 8. https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
Windows 8,Windows 8.1,Windows Server 2012和Windows Server 2012 R2使用TSC作为性能计数器的基础。 TSC 同步算法得到了显着改善,效果更好 适用于具有多个处理器的大型系统。
更重要的是,您的基准测试代码本身已被破坏。 QuadPart
的类型为LONGLONG
,表达式gEnd.QuadPart-gStart.QuadPart
也是如此。但是您使用期望%g
的{{1}}格式说明符打印此表达式。因此,您调用未定义的行为,您正在阅读的输出完全是废话。
同样,double
是另一个错误。
话虽这么说,操作系统通常不会在实际使用该存储区之前进行实际的堆分配。这意味着你的程序中可能没有实际的分配。
要在基准测试期间抵消此行为,您必须实际使用内存。例如,您可以添加类似的内容以确保实际发生分配:
printf("ERROR\n", size);
答案 1 :(得分:-7)
性能取决于许多事实 os,ram,cpu等。
我在同一台PC上的Windows 7和Windows 10中运行了这个程序
cpu计算事情更快。我怀疑你的cpu和ram是不够的 匹配Windows 10,适用于Windows 7(比10更轻的图像) 我建议尝试使用Windows 10的其他系统,其中cpu获取指令形式ram应该足够快,并且ram大小应该与你的Windows 7上的cpu相匹配,并确保关闭在后端运行的所有应用程序。