2011-04-29 22 views
9

Necesito una fecha que se convierta cíclicamente en sus componentes (hora, minuto, segundo). El siguiente código hace esto bastante bien.Conversión de fecha en hora/minuto/segundo increíblemente lento

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 

Sin embargo, este es un problema de rendimiento. He examinado el código fuente con un generador de perfiles, y la conversión de Now en sus componentes parece ser increíblemente lenta. ¿Hay una manera rápida de desmontar el tiempo actual en sus partes componentes?

+0

Definir increíblemente lento. 1 ms? ¿1 segundo? ¿Es este un proceso que ocurre una y otra vez? Si es así ¿con qué propósito? Puede ser que solo necesites un nuevo enfoque. – Mikecito

+0

No puedo llamar al método (completo) más de 50 a 100 veces por segundo. El generador de perfiles (AQtime) dice que esto consume la mayor cantidad de tiempo. – user730451

+0

¿Por qué necesita hacer esto 50-100 veces por segundo? No estoy diciendo que no tenga una razón válida, solo busca ver lo que está tratando de lograr para posiblemente proporcionar una forma alternativa de hacerlo. – Mikecito

Respuesta

10

Eche un vistazo a Extremoptimization.com. Hay algunos pensamientos matemáticos interesantes sobre esto. Aquí hay un posible esbozo de una solución:

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 

Pero ten cuidado. Su código fuente no será mantenible. Esto hace que su conversión sea muy confiable, pero no estoy seguro si alguien más entenderá lo que está haciendo en la primera vista. La recompensa es una conversión, es aproximadamente 25 veces más rápido que el enfoque clásico. Sin embargo, aún debe pensar en su enfoque y si no es posible evitarlo.

Cuestiones relacionadas