Vb.net VBS自动优化
我正在运行一个非常简单的VB程序来解决Euler项目,我想计算性能的时间。我的做法是:Vb.net VBS自动优化,vb.net,performance,vba,optimization,Vb.net,Performance,Vba,Optimization,我正在运行一个非常简单的VB程序来解决Euler项目,我想计算性能的时间。我的做法是: StartTime = Timer() Set streamer = CreateObject("Scripting.FileSystemObject") Set writingWriter = streamer.GetStandardStream(1) Dim n, nIterations, Temp1, Temp2, Collector n = 4000000 nIterations = 0 Temp1
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 to execute
有人能解释一下这是怎么回事吗?Windows控制台似乎已经存储了Fib的值,只是在执行代码时调用它。一位朋友运行类似的程序(尽管他使用VBA)得到了相同的结果——他随后的每一次执行都经历了运行时间的减少
请注意:我知道这是一个非常简单的方法,我只是想了解VB。到目前为止还不是一个超级粉丝。你回答了自己的问题: 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 = 0
问题不是谎言。虽然您没有声明它,但它在计算中使用时会立即使用默认值。一旦脚本结束,它就会超出范围。程序的主要瓶颈是:
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)
一旦它第一次运行,很可能由于RAM中缓存的数据,它能够在不久之后更快地执行相同的操作
您在Do循环中进行的实际计算发生得如此之快,以至于计时器不够精确,无法区分时间。你可能会发现关于这个问题的一些信息:有趣。如果你在谷歌上搜索“程序第二次运行得更快”,你会看到很多反应,表明缓存是罪魁祸首。非常酷-谢谢你的帮助!然而,将Fib设置为零似乎并不能解决问题。有没有办法直接清除临时内存?也许如果有固定的空间,我可以简单地运行一个脚本,使临时内存过载,并强制执行旧的内容?VBScript是学习VB最糟糕的环境,因为您的开发环境通常是记事本,而不是IDE,它可以为您建议对象和语法检查。如果您的目标是将VB作为一种语言学习,那么MS Office或Visual Studio Express中的VBA将是更好的选择。@JamesSnell感谢您提供的提示。我想我给VBA打了一针。我只是不喜欢打开Excel。我会使用Visual Studio,但没有管理员权限无法安装。感谢您的回复!我在谷歌上搜索过这个问题,但没有想到将搜索范围扩大到一般情况。你提供的链接是一个很好的阅读(仍在进行中)。
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)