2011-04-29 47 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倍。 但是,你仍应该考虑你的方法,如果不能避免这种情况。

相关问题