|
二十分钟前看到百度知道里有人问为什么勾与股的限制均为1-10000时,这个枚举软件能在10秒不到的时间算完。我就自己试了试。。。尼玛竟然18秒,如图所示:
18seconds
检查了一下自己的算法貌似是没问题的,于是就在想是不是代码编译的问题,于是把高级优化的所有的勾打上了,然后,结果是17秒。。。
17seconds
然后就想是不是电脑配置的问题,测试下来影响并不大。前面的两个测试结果均是在2.67GHz CPU+512MB RAM的虚拟机测试的,而这次我在Intel Xeon x5650+16GB RAM的物理机上测试了一遍,结果是15秒。。。
15seconds
我擦。。。貌似配置的影响也不是很大啊。
谁来告诉我为什么!!!
贴代码了,先贴按钮的事件代码:
- Private Sub Command1_Click()
- Dim StGou As Long, SpGou As Long
- Dim StGu As Long, SpGu As Long
- Dim MyXian As Double
- Dim LvX As ListItem, LvC As Long
- Dim ETime As Long
- Dim FTime As SYSTEMTIME, CTime As SYSTEMTIME
- Call GetLocalTime(FTime)
- LvC = 0
- StGou = CLng(Text1.Text)
- StGu = CLng(Text2.Text)
- SpGou = CLng(Text3.Text)
- SpGu = CLng(Text4.Text)
- Dim i As Long, j As Long
- PB.Value = 0
- PB.Max = SpGou - StGou + 1
- Lv1.ListItems.Clear
- For i = StGou To SpGou Step 1
- For j = i To SpGu Step 1
- MyXian = Sqr(i ^ 2 + j ^ 2)
- If (Int(MyXian) = MyXian) Then
- LvC = LvC + 1
- Set LvX = Lv1.ListItems.Add(LvC, , i)
- LvX.ListSubItems.Add 1, , j
- LvX.ListSubItems.Add 2, , MyXian
- End If
- Next j
- PB.Value = PB.Value + 1
- Next i
- Call GetLocalTime(CTime)
- ETime = SubTime(FTime, CTime)
- SB.Panels.Item(1).Text = "勾股数组个数:" & LvC
- SB.Panels.Item(3).Text = "耗时:" & ETime & "秒"
- End Sub
复制代码
其中SB是StatusBar控件,PB是ProgressBar控件,Lv1是ListView控件
其中有个函数叫做SubTime,其代码实现是:
- Private Function SubTime(ByRef FirstTime As SYSTEMTIME, ByRef NextTime As SYSTEMTIME) As Long
- Dim ws As Integer
- Dim wmin As Integer
- Dim wh As Integer
- Dim wd As Integer
- ws = NextTime.wSecond - FirstTime.wSecond
- wmin = NextTime.wMinute - FirstTime.wMinute
- wh = NextTime.wHour - FirstTime.wHour
- wd = NextTime.wDay - FirstTime.wDay
- SubTime = ws + wmin * 60 + wh * 3600 + wd * 86400
- End Function
复制代码
貌似不够严谨,如果是在跨月份的半夜执行这个函数就会出问题。这个BUG大家可以自己去修复。
百度知道的链接是在http://zhidao.baidu.com/question/984385218752419859.html?entry=qb_ihome_tag
|
|