下面的代码从午夜开始以分钟为单位计算时间范围,并创建一个包含分钟和小时的数组。但是,它很慢。有什么更好的建议吗?(不,不能更改语言:-)
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) .....
问候
发布于 2010-05-25 22:17:42
你想知道每小时有多少分钟在时间跨度内吗?
我认为这应该可以做到这一点,或者类似的东西:
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倍。
附注:如果时间跨度可以跨越午夜(到达<离开),则将到达时间加上24*60,执行相同的逻辑,如果是lHour >= 24,则将数字放入lHour - 24。
发布于 2010-05-25 16:32:26
好吧,这样如何:
For lMinute = clDeparture To clArrival - 1
alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
Next假设您只会在clDeparture和clArrival之间的几分钟内执行任何操作,那么循环遍历其余的操作是没有意义的。
这是一个简单的开始。你当然可以通过查看每小时而不是每分钟来改进它,并检查该时间段“覆盖”了多大比例的时间。这会更棘手,但肯定是可行的。我不想冒险用VB编写这些代码,但如果你真的想要的话,我可能会开发出一个C#版本。我会从简单的代码开始,看看这是否足够快。
发布于 2010-05-25 22:31:04
使用整数运算而不是浮点数:
Int(lMinute / 60)等同于
lMinute \ 60但后者速度更快,因为它使用了整数除法,并且省去了从Long到Double再转换的需要。此外,VB6不能很好地进行优化。如果需要该值两次,请考虑将结果存储在变量中。
https://stackoverflow.com/questions/2903029
复制相似问题