0

我刚刚完成了一个项目,但是我的老师有一个问题。为什么我的程序(具有相同的算法、相同的数据、相同的环境)在不同的时刻以不同的完成时间运行。?谁能帮我?

示例:现在我的程序运行了 1.03 秒。但随后它运行了 1.05 秒(有时更快 1.01)。

4

5 回答 5

2

发生这种情况是因为您的程序不是系统中执行的唯一实体,并且它不会始终立即获得所有资源。

出于这个原因,测量短执行时间几乎没有什么价值,因为它们的变化非常明显。相反,如果您对更准确的时间测量感兴趣,您应该多次执行您的代码并计算所有运行的平均时间。

于 2013-03-28T06:14:08.017 回答
1

因为 Windows 不是实时操作系统。执行程序时可能会发生许多其他活动,并且 cpu 可以与其他正在运行的进程共享其周期。如果您的程序需要从物理设备作为磁盘(数据库)和网络读取,时间可能会发生更大的变化:这是因为物理资源可能正忙于服务其他请求。内存也可以改变事情,如果有的话page faults,所以你的应用程序需要从虚拟内存中读取页面,结果你会看到性能下降。由于您使用的是C#,时间可以从第一次执行到同一进程中的其他时间发生明显变化,因为代码是JITtted,即第一次看到从中间代码编译到程序集,然后在程序集中使用形式,这要快得多。

于 2013-03-28T06:13:40.443 回答
1

这很容易。您使用不精确的计数器捕获系统时差,因为它使用系统资源。有更多的程序与您的程序并行运行,有些程序优先于您的代码,导致线程临时(约 20 毫秒,取决于操作系统设置)暂停。即使在 DOS 中,也有与您的代码准并行运行的代码,因为只有一个线程可能,您的代码在时间仍在滴答作响的情况下停止(它由该代码控制)。

于 2013-03-28T06:13:46.460 回答
1

这里只是一个想法,但可能是因为内存使用情况的变化,后台应用程序的 cpu 使用情况在不同时间发生变化。我的意思是时差只会在以下时间产生差异;

  • 其他应用程序的内存使用情况
  • cpu发热等物理条件。(时间变化真的很小)
  • 和系统时钟。如果您生成随机数或执行任何在后台使用系统时钟的操作,则可能会产生这种变化。

希望这可以帮助。干杯。

于 2013-03-28T06:18:59.890 回答
0

假设是错误的。环境不一样。您的程序的可用资源取决于很多事情。例如,其他进程(例如后台进程)的 CPU 和内存利用率。由于其他进程而导致的硬盘和/或网络利用率。即使没有其他进程在运行您的程序,也会改变缓存的内部状态。

在“现实世界”的性能场景中,“热身”后出现 +/- 20% 的波动并不少见。即:连续测量10次作为“热身”并丢弃结果。多测量 10 次并收集结果。--> +/- 20% 很常见。如果您不热身,您甚至可能会看到由于“冷”缓存而导致的几个数量级的差异。

结论:您的程序非常小,使用的资源非常少,并且没有从持久缓存机制中受益。

于 2013-03-28T06:23:03.440 回答