以每小时分钟计算的代码优化

时间:2010-05-25 08:19:29

标签: vb.net optimization mathematical-optimization

以下代码采用自午夜以来的分钟时间范围,并创建一个小时为pr小时的数组。但是,它很慢。还有更好的建议吗? (不,改变语言不是一种选择:-))

Const clDeparture   As Long = 123
Const clArrival     As Long = 233
Dim lHour           As Long
Dim lMinute         As Long
Dim alHour(25)      As Long

For lMinute = 0 To 1440
    If lMinute >= clDeparture And lMinute < clArrival Then
        alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
    End If
Next

数组现在应该包含:

(0,0)  (1,0)  (2,57)  (3,53)  (4,0).....

此致

3 个答案:

答案 0 :(得分:1)

那么,怎么样:

For lMinute = clDeparture To clArrival - 1
    alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
Next

鉴于你只会在clDepartureclArrival之间采取任何行动,所以没有必要循环其余部分。

这是一个简单的开始。您当然可以通过查看每个小时而不是每个分钟来改进它,并检查该时间段的“覆盖”时间段的比例。那会比较棘手,但肯定可行。我不想冒险在VB中编写代码,但如果你真的想要,我可能会掀起一个C#版本。我从简单的代码开始,看看它是否足够快。

答案 1 :(得分:1)

您想知道时间跨度内每小时的分钟数吗? 我认为这应该做到,或者接近它:

lDepHour = Int(clDeparture / 60)
lDepMinute = clDeparture - lDepHour * 60
lArrHour = Int(clArrival / 60)
lArrMinute = clArrival - lArrHour * 60

If (lDepHour = lArrHour) Then
  alHour(lDepHour) = lArrMinute - lDepMinute
Else
  alHour(lDepHour) = 60 - lDepMinute
  alHour(lArrHour) = lArrMinute
  For lHour = lDepHour + 1 To lArrHour - 1
    alHour(lHour) = 60
  End For
End If

这应该比你的速度快60倍。

P.S。如果时间跨度可以跨越午夜(到达&lt;离开),则在到达时间中添加24 * 60,执行相同的逻辑,如果lHour >= 24,则将数字放在lHour - 24

答案 2 :(得分:0)

使用整数运算而不是浮点运算:

Int(lMinute / 60)

相同
lMinute \ 60

但后者更快,因为它使用整数除法,无需将Long转换为Double并返回。此外,VB6不能很好地优化。如果需要两次该值,请考虑将结果存储在变量中。