2

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

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) .....

问候

4

3 回答 3

1

那么,怎么样:

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

鉴于您只会在clDeparture和之间的几分钟内执行任何操作clArrival,因此循环遍历其余部分是没有意义的。

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

于 2010-05-25T08:32:25.883 回答
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 倍。

PS如果时间跨度可以跨越午夜(到达<离开)然后将24 * 60添加到到达时间,执行相同的逻辑,如果lHour >= 24,将数字放入lHour - 24

于 2010-05-25T14:17:42.403 回答
0

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

Int(lMinute / 60)

是相同的

lMinute \ 60

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

于 2010-05-25T14:31:03.667 回答