2011-04-29 8 views
9

Potrzebuję daty cyklicznie przekształcanej na jej składniki (godzina, minuta, sekunda). Poniższy kod robi to całkiem dobrze.Konwersja daty na godzinę/minutę/sekundę niesamowicie wolno

Dim time_hour As Integer 
Dim time_minute As Integer 
Dim time_second As Integer 
Dim time_ms As Integer 
Dim storedNow As Date 

storedNow = Now 
time_hour = storedNow.Hour 
time_minute = storedNow.Minute 
time_second = storedNow.Second 
time_ms = storedNow.Millisecond 

Jednak znalazłem to problem z wydajnością. Sprawdziłem kod źródłowy za pomocą profilera, a konwersja Now na jego komponenty wydaje się niesamowicie powolna. Czy istnieje obecnie szybki sposób na rozmontowanie części składowych?

+0

Zdefiniuj niesamowicie wolno. 1 ms? 1 sekunda? Czy to proces, który ma miejsce w kółko? Jeśli tak, to w jakim celu? Być może potrzebujesz nowego podejścia. – Mikecito

+0

Nie mogę wywołać metody (pełnej) więcej niż 50 do 100 razy na sekundę. Profiler (AQtime) mówi, że to pochłania najwięcej czasu. – user730451

+0

Dlaczego trzeba to robić 50-100 razy na sekundę? Nie mówię, że nie masz ważnego powodu, tylko chcesz zobaczyć, co próbujesz osiągnąć, aby ewentualnie dostarczyć alternatywny sposób, aby to zrobić. – Mikecito

Odpowiedz

10

Spójrz na Extremoptimization.com. Jest kilka interesujących myśli matematycznych na ten temat. Oto możliwy szkic rozwiązania:

Dim ticks As Long 
Dim time_hour As Integer 
Dim time_minute As Integer 
Dim time_second As Integer 
Dim time_ms As Integer 
Dim storedNow As Date 

storedNow = Now 
ticks = storedNow.Ticks 
time_ms = CInt((ticks \ 10000) Mod 86400000) 
time_hour = CInt(Math.BigMul(time_ms >> 7, 9773437) >> 38) 
time_ms -= 3600000 * time_hour 
time_minute = CInt(((Math.BigMul(time_ms >> 5, 2290650)) >> 32)) 
time_ms -= 60000 * time_minute 
time_second = ((time_ms >> 3) * 67109) >> 23 
time_ms -= 1000 * time_second 

Ale bądź ostrożny. Twój kod źródłowy nie będzie możliwy do utrzymania. Dzięki temu konwersja jest bardzo niezawodna, ale nie jestem pewien, czy ktokolwiek inny zrozumiałby, co robisz w pierwszym widoku. Nagrodą jest konwersja, która jest około 25 razy szybsza niż klasyczne podejście. Jednak nadal należy myśleć o swoim podejściu i jeśli nie można tego uniknąć.

Powiązane problemy