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
Vb.net VBS自动优化_Vb.net_Performance_Vba_Optimization - Fatal编程技术网

Vb.net VBS自动优化

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

我正在运行一个非常简单的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 = 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)