2011-04-29 86 views
9

我需要將日期週期性地轉換爲其組件(小時,分鐘,秒)。下面的代碼很好地做到了這一點。將日期轉換爲小時/分鐘/秒非常慢

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 

但是,我發現這是一個性能問題。我用探查器檢查了源代碼,將Now轉換爲其組件似乎非常慢。有沒有一種快速的方法來解開當前的時間來分解它的組成部分?

+0

定義令人難以置信的緩慢。 1毫秒? 1秒?這是一個反覆發生的過程嗎?如果是這樣,爲了什麼目的?這可能是你只需要一種新的方法。 – Mikecito 2011-04-29 04:33:24

+0

我無法每秒鐘調用(完整)方法超過50到100次。分析器(AQtime)表示,這消耗了大部分時間。 – user730451 2011-04-29 04:36:08

+0

爲什麼你需要每秒鐘做50-100次?我並不是說你沒有一個合理的理由,只是想看看你正在努力完成什麼,以便提供一種替代方式來實現它。 – Mikecito 2011-04-29 04:42:06

回答

10

看看Extremoptimization.com。關於這一點有一些有趣的數學思想。以下是一個解決方案的草圖:

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 

但要小心。您的源代碼將無法維護。這樣做的轉換非常可靠,但我不確定其他人是否會理解您在第一個視圖中所做的操作。獎勵是一種轉化,比傳統方法快25倍。 但是,你仍應該考慮你的方法,如果不能避免這種情況。

相關問題