【问题标题】:Code optimization on minutes pr hour calculation分钟/小时计算的代码优化
【发布时间】:2012-05-05 08:31:50
【问题描述】:

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

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

问候

【问题讨论】:

  • 嗯,在类似生产的环境中运行一百万次大约需要一分钟。 (当然这不会按顺序发生,中间还有其他操作)。我只是觉得必须有更好的方法来做到这一点。

标签: vb.net optimization mathematical-optimization


【解决方案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 倍左右。

附:如果时间跨度可以跨越午夜(到达lHour >= 24,则将数字放入lHour - 24

【讨论】:

  • 完美,这就是我想要的,谢谢!顺便说一句,1mill 测试从 63 秒缩短到 297 毫秒 :-)
【解决方案2】:

那么,怎么样:

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

鉴于您只会在 clDepartureclArrival 之间执行任何操作几分钟,因此循环执行其余操作是没有意义的。

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

【讨论】:

  • 呵呵,谢谢,这将时间缩短了 60%。但是,必须有办法做到这一点?
  • 嘿,如果你能做一个 C# 版本,那么我可能会将它转换为 VB,这只是围绕这个问题的基本数学问题,我有问题
  • @corger:我会看看以后能不能找到时间。只是为了检查一下,您真的希望它是 inclusive of clDepartureexclusive of clArrival,对吗?
  • 对,我一开始尝试每小时做一次,然后就放弃了,用我能想到的最简单的方法来做。所以,是的,在 clDeparture 和 clArrival 之间。
【解决方案3】:

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

Int(lMinute / 60)

相同
lMinute \ 60

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

【讨论】:

  • Nix,不一样,用 Int() 包装它只会返回整数部分......没有它会发生舍入,分钟会在错误的时间结束。不过,将结果存储在变量中是个好主意。
  • @corger:它相同:请注意第二个代码使用反斜杠:这是一个整数除法same 在两个代码中进行舍入:两个结果总是向零舍入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2018-01-22
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多