Оптимизация кода по минутам или расчету часа - PullRequest
2 голосов
/ 25 мая 2010

Следующий код берет временной интервал в минутах с полуночи и создает массив с минутами до часа Но это медленно. Есть лучшие предложения там? (нет, смена языка не возможна :-))

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

Привет

Ответы [ 3 ]

1 голос
/ 25 мая 2010

Вы хотите знать, сколько минут каждого часа находится в промежутке времени?
Я думаю, что это должно сделать это, или что-то близкое к этому:

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 раз быстрее, чем у вас.

P.S. Если промежуток времени может охватывать полночь (прибытие <отправление), добавьте 24 * 60 ко времени прибытия, выполните ту же логику, а если <code>lHour >= 24, введите числа в lHour - 24.

1 голос
/ 25 мая 2010

Ну, как насчет:

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

Учитывая, что вы будете предпринимать какие-либо действия только в течение нескольких минут между clDeparture и clArrival, нет смысла проходить через все остальные.

Это простое начало. Конечно, вы можете улучшить его, просматривая каждый час вместо каждой минуты и проверяя, какая часть этого времени была «покрыта» периодом времени. Это было бы сложнее, но, безусловно, выполнимо. Я бы не хотел рисковать, чтобы кодировать это на VB, но я мог бы, вероятно, поднять версию C #, если бы вы действительно этого хотели. Я бы начал с простого кода и посмотрел, достаточно ли это быстро.

0 голосов
/ 25 мая 2010

Использовать целочисленную арифметику вместо плавающей запятой:

Int(lMinute / 60)

совпадает с

lMinute \ 60

Но последний работает быстрее, поскольку использует целочисленное деление и избавляет от необходимости конвертировать из Long в Double и обратно Кроме того, VB6 плохо оптимизируется. Если вам нужно значение дважды, попробуйте сохранить результат в переменной.

...