Vb.net 分钟/小时计算的代码优化
下面的代码从午夜开始以分钟为单位创建了一个以分钟为单位的数组。但是,它很慢。还有更好的建议吗?(不,更改语言不是一个选项:-))Vb.net 分钟/小时计算的代码优化,vb.net,optimization,mathematical-optimization,Vb.net,Optimization,Mathematical Optimization,下面的代码从午夜开始以分钟为单位创建了一个以分钟为单位的数组。但是,它很慢。还有更好的建议吗?(不,更改语言不是一个选项:-)) Const cldepartment,只要长度=123 常数=233 我们的时间一样长 暗淡的一分钟和长的一样 一小时(25)长 对于l分钟=0到1440 如果lMinute>=CLDEVIATION且lMinute
Const cldepartment,只要长度=123
常数=233
我们的时间一样长
暗淡的一分钟和长的一样
一小时(25)长
对于l分钟=0到1440
如果lMinute>=CLDEVIATION且lMinute
阵列现在应包含:
(0,0)
(1,0)
(2,57)
(3,53)
(4,0)
关于好吧,那么:
For lMinute = clDeparture To clArrival - 1
alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
Next
考虑到您只需要在cldeeption
和clarival
之间的几分钟内执行任何操作,因此循环执行其余操作是没有意义的
这是一个简单的开始。你当然可以通过查看每一小时而不是每一分钟,并检查该时间段“覆盖”的时间比例来改进它。这将是棘手的,但肯定是可行的。我不想冒险在VB中编写这些代码,但如果你真的想的话,我可能会设计一个C版本。我先从简单的代码开始,看看这是否足够快。你想知道时间跨度中每小时有多少分钟吗?
我认为应该这样做,或者做一些类似的事情:
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
使用整数算术而不是浮点:
Int(lMinute / 60)
与
lMinute \ 60
但后者速度更快,因为它使用整数除法,省去了从
Long
到Double
再转换回来的需要。此外,VB6没有很好地优化。如果您需要两次值,考虑将结果存储在变量中。嗯,运行一百万次在类似生产的环境中花费大约一分钟。(当然,这不会按顺序发生,中间还有其他操作)。我只是觉得一定有更好的方法。呵呵,谢谢,这样就节省了60%的时间。但是,一定有办法完成这个公关小时?嘿,如果你能做一个C版本,那么我可能会把它转换成VB,这只是关于这个问题的基本数学,我有问题with@corger例如我看看以后能不能找到时间。只是想检查一下,你真的希望它包括cldepartment
,不包括clarival
,对吗?对,我开始试着每小时做一次,然后放弃了,用我能想到的最简单的方法做了。所以,是的,在cldeeption和clarival.Nix之间,不同的是,用Int()包装它只会返回整数部分。。。如果没有它,将发生舍入,分钟将在错误的时间结束。将结果存储在变量中是一个好主意。@corger:这是一样的:注意,第二个代码使用反斜杠:这是一个整数除法。在两个代码中进行相同的舍入:两个结果总是向零舍入。太好了,这就是我想要的,谢谢!,顺便说一句,1mill测试从63秒变为297毫秒:-)
lMinute \ 60