Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows 7系统上测量的性能差异很大_C_Performance_Windows 7 - Fatal编程技术网

C Windows 7系统上测量的性能差异很大

C Windows 7系统上测量的性能差异很大,c,performance,windows-7,C,Performance,Windows 7,我正在尝试对Windows控制台模式的应用程序(在VS 2012 Express下用C编写)进行一些性能增强,希望获得20%左右的性能,从而赢得一个有竞争力的基准测试。我被软件测量性能的巨大差异打败了,重复完全相同的测试可以产生与最佳时间相差100%的结果(我见过更多) 该测试是在Windows7Pro的四核2.7GHz处理器上运行的。没有其他正在运行的进程消耗任何重要的系统电源 该程序主要涉及字符串操作。除了报告结果之外,没有i/o,但大量使用malloc()和free()。程序有第二个线程,

我正在尝试对Windows控制台模式的应用程序(在VS 2012 Express下用C编写)进行一些性能增强,希望获得20%左右的性能,从而赢得一个有竞争力的基准测试。我被软件测量性能的巨大差异打败了,重复完全相同的测试可以产生与最佳时间相差100%的结果(我见过更多)

该测试是在Windows7Pro的四核2.7GHz处理器上运行的。没有其他正在运行的进程消耗任何重要的系统电源

该程序主要涉及字符串操作。除了报告结果之外,没有i/o,但大量使用malloc()和free()。程序有第二个线程,该线程在整个测试过程中将处于空闲状态

我通过使用GetProcessTimes()函数在一个大约需要5秒的测试中记录处理器时间来测量性能。相反,测量经过的时间会产生相同的行为。同样清楚的是,这是一个真正的性能差异,而不是测量技术的不准确

有趣的是,从同一个命令提示符窗口多次运行该程序会产生相当接近(但仍然无法解释)的性能变化。打开新的命令提示窗口有时会产生显著不同的性能,但在命令提示窗口的同一实例中重复测试会产生相当一致的结果

这太疯狂了。为什么父进程对其子进程的性能有任何影响

我知道系统会根据系统负载自动调整处理器速度。我所能做的就是在相同的条件下重复测试,希望处理器每次都能以大致相同的速度运行。我尝试在程序的定时部分之前插入一个较长的CP密集型循环,以便处理器能够确定适当的速度。正如预期的那样,任务管理器显示我的进程消耗了可用处理器功率的25%

我也读过关于性能变化的相关问题,但没有一个能解释我所看到的

在试图追踪这一点时,我注意到这个过程正在产生大量的软页面错误。Windows任务管理器显示的页面错误增量通常超过400000。我读过无数关于页面错误的文章,其中大多数都说可以忽略软页面错误,但这个值似乎足够高,它肯定会对性能产生影响。当性能处于最佳状态时,页面错误增量要低得多,这支持了这一观点

所以,我的问题是:(1)为什么我看到完全相同的程序的性能有很大的变化;(2)是否有一些监控工具可以解释非常高的软页面错误


非常感谢所有的想法。谢谢。

也许您可以通过使用静态数组而不是大量使用
malloc
free
来提高性能,这大概是真正的目标。在这些情况下,我使用在程序开始和结束时调用的更简单的
clock()
函数。虽然在Windows上,这给了我在墙上的时间,但它仍然很好地说明了我在做什么,尤其是当检查我提交的目标计算机通常比我自己的计算机运行得更快时。尽管如此,我的执行时间从来都不一致。也许这会有用:这篇文章看起来很有趣。谢谢。谢谢你的想法,但是使用静态数组不是一个选项。把这放到上下文中,相关的软件是我们的商业数据库包,基准测试正在进行大量的字符串操作,其中字符串大小无法提前预测。链接文章可能解释了测量性能的一些可变性,但留下了一个问题:为什么我会看到如此巨大的软页面错误增量,为什么从不同的命令提示符窗口运行程序有时会产生非常不同的数据,但在每个窗口中都是一致的。也许您可以通过使用静态数组而不是大量的
malloc
free
使用,这大概是真正的目标。在这些情况下,我使用在程序开始和结束时调用的更简单的
clock()
函数。虽然在Windows上,这给了我在墙上的时间,但它仍然很好地说明了我在做什么,尤其是当检查我提交的目标计算机通常比我自己的计算机运行得更快时。尽管如此,我的执行时间从来都不一致。也许这会有用:这篇文章看起来很有趣。谢谢。谢谢你的想法,但是使用静态数组不是一个选项。把这放到上下文中,相关的软件是我们的商业数据库包,基准测试正在进行大量的字符串操作,其中字符串大小无法提前预测。链接的文章可能解释了测量性能的一些可变性,但留下了一个问题:为什么我会看到如此巨大的软页面错误增量,为什么从不同的命令提示符窗口运行程序有时会产生非常不同的数据,但在每个窗口中是一致的。