Go - time - 毫秒

时间:2011-05-28 13:11:54

标签: go

我需要以毫秒为单位的时间来处理大量的事务,所以我想要一些正确且快速的东西。以下工作会做得最好吗? :


    iMilli  := int((time.Nanoseconds() % 1e6) / 1e3)

TIA

3 个答案:

答案 0 :(得分:6)

编辑由于首次编写此答案,因此已将转义分析代码添加到Go编译器中。这允许编译器在某些情况下避免不必要的分配,包括(可能)下面描述的那种情况。因此,对于最新的周期,使用更直接的time toNanoseconds()可能同样好。请进行自己的分析。

大多数时候,函数会导致堆分配(随后需要收集,导致应用程序暂停)。因此,如果你经常查看时间,听起来就像你一样,你需要直接使用syscall.Gettimeofday()(这是其他时间函数最终调用的函数)。有关详细信息,请参阅此处的讨论:

http://groups.google.com/group/golang-nuts/browse_thread/thread/f2209022f43efcca?pli=1

我正在使用的解决方案是预先分配一个tv syscall.Timeval,每次通过我的内循环我都这样做:

syscall.Gettimeofday(&tv)

然后您可以使用以下内容获取毫秒:

(int64(tv.Sec)*1e3 + int64(tv.Usec)/1e3)

我发现这比调用time.Nanoseconds()或其他更高级别的时间函数要好得多。

答案 1 :(得分:3)

一秒钟内有1e9纳秒,一毫秒内有1e6纳秒,所以你可以这样做:

func getTimeString() string {
    now := time.Nanoseconds()
    localTime := time.SecondsToLocalTime(now/1e9)
    miliSeconds := (now % 1e9) / 1e6
    return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d.%03d",localTime.Year,localTime.Month,localTime.Day,localTime.Hour,localTime.Minute,localTime.Second,miliSeconds)
}

答案 2 :(得分:2)

您可以使用以下代码获取1970年6月1日之后的当前时间毫秒

time.Now().UnixNano()%1e6/1e3