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

から までの数分間だけアクションを実行することを考えるとclDepartureclArrivalそれらの残りをループしても意味がありません。

それは簡単なスタートです。1分ごとではなく1時間ごとに調べて、その期間で「カバー」された時間の割合を確認することで、確実に改善できます。それはよりトリッキーですが、確かに実行可能です。あえて 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 は適切に最適化されません。値が 2 回必要な場合は、結果を変数に格納することを検討してください。

于 2010-05-25T14:31:03.667 に答える