首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBS自动优化

VBS自动优化
EN

Stack Overflow用户
提问于 2012-12-19 00:21:31
回答 2查看 536关注 0票数 2

我正在运行一个非常简单的VB程序,它解决了Project Euler Problem 2,我想对性能进行计时。我的方法是:

代码语言:javascript
复制
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")

第一次运行代码时,我得到了以下输出(也包括我的输入):

代码语言:javascript
复制
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

每次后续执行(不更改任何内容)都会给我提供以下内容:

代码语言:javascript
复制
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。到目前为止还不是一个超级粉丝。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-19 00:44:27

问题不是Fib。虽然您没有声明它,但只要在计算中使用它,它就会使用默认值。一旦脚本结束,它就会超出范围。您的程序的主要瓶颈区域是:

代码语言:javascript
复制
Set streamer = CreateObject("Scripting.FileSystemObject")
Set writingWriter = streamer.GetStandardStream(1)

一旦它第一次运行,它很快就能够更快地执行相同的操作,这可能是因为数据缓存在RAM中。

您在Do循环中进行的实际计算发生得如此之快,以至于您的计时器不够精确,无法区分时间。你可能会发现关于这个问题的一些信息:What can cause a program to run much faster the 2nd time?很有趣。如果你用谷歌搜索“第二次程序运行得更快”,你会看到很多表明缓存是罪魁祸首的回复。

票数 1
EN

Stack Overflow用户

发布于 2012-12-19 00:29:23

你回答了你自己的问题:

似乎Windows控制台已经存储了Fib的值,并在代码执行时简单地调用它。

如果您在退出之前没有清除Fib,并且让控制台保持打开状态,那么它仍然在临时内存中的某个位置。

修复方法是:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13937204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档