我正在运行一个非常简单的VB程序,它解决了Project Euler Problem 2,我想对性能进行计时。我的方法是:
StartTime = Timer()
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)
Dim n, nIterations, Temp1, Temp2, Collector
n = 4000000
nIterations = 0
Temp1 = 0
Collector = 0
Temp2 = 1
Do
Fib = Temp1 + Temp2
Temp2 = Temp1
Temp1 = Fib
Select Case Fib Mod 2
Case 0
Collector = Collector + Fib
End Select
Loop Until Fib > n
EndTime = Timer()
writingWriter.WriteLine("Solution is: " & Collector)
writingWriter.WriteLine("Code took " & EndTime - StartTime & " to execute")第一次运行代码时,我得到了以下输出(也包括我的输入):
C:\Dev\cscript program.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Solution is: 4613732
Code took 0.015625 to execute每次后续执行(不更改任何内容)都会给我提供以下内容:
C:\Dev\cscript program.vbs
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Solution is: 4613732
Code took 0 to execute有人能解释一下这是怎么回事吗?Windows控制台似乎已经存储了Fib的值,并在代码执行时简单地调用它。一位朋友运行类似的程序(尽管他使用的是VBA)得到了相同的结果-他随后的每一次执行都经历了运行时间的减少。
请注意:我知道这是一个非常简单的方法,我只是想尝试一下VB。到目前为止还不是一个超级粉丝。
发布于 2012-12-19 00:44:27
问题不是Fib。虽然您没有声明它,但只要在计算中使用它,它就会使用默认值。一旦脚本结束,它就会超出范围。您的程序的主要瓶颈区域是:
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)一旦它第一次运行,它很快就能够更快地执行相同的操作,这可能是因为数据缓存在RAM中。
您在Do循环中进行的实际计算发生得如此之快,以至于您的计时器不够精确,无法区分时间。你可能会发现关于这个问题的一些信息:What can cause a program to run much faster the 2nd time?很有趣。如果你用谷歌搜索“第二次程序运行得更快”,你会看到很多表明缓存是罪魁祸首的回复。
发布于 2012-12-19 00:29:23
你回答了你自己的问题:
似乎Windows控制台已经存储了Fib的值,并在代码执行时简单地调用它。
如果您在退出之前没有清除Fib,并且让控制台保持打开状态,那么它仍然在临时内存中的某个位置。
修复方法是:
StartTime = Timer()
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)
Dim n, nIterations, Temp1, Temp2, Collector
n = 4000000
nIterations = 0
Temp1 = 0
Collector = 0
Temp2 = 1
Do
Fib = Temp1 + Temp2
Temp2 = Temp1
Temp1 = Fib
Select Case Fib Mod 2
Case 0
Collector = Collector + Fib
End Select
Loop Until Fib > n
EndTime = Timer()
writingWriter.WriteLine("Solution is: " & Collector)
writingWriter.WriteLine("Code took " & EndTime - StartTime & " to execute")
streamer = NULL
writingWriter = NULL
Fib = 0https://stackoverflow.com/questions/13937204
复制相似问题