mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2026-01-03 13:06:37 +08:00
优化代码:使用fasttime取代以往的utils.UnixTime
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package expires
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
||||
"github.com/iwind/TeaGo/assert"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
@@ -197,7 +197,7 @@ func BenchmarkList_GC(b *testing.B) {
|
||||
for m := 0; m < 1_000; m++ {
|
||||
var list = NewList()
|
||||
for j := 0; j < 10_000; j++ {
|
||||
list.Add(uint64(j), utils.UnixTime()+100)
|
||||
list.Add(uint64(j), fasttime.Now().Unix()+100)
|
||||
}
|
||||
lists = append(lists, list)
|
||||
}
|
||||
|
||||
93
internal/utils/fasttime/time_fast.go
Normal file
93
internal/utils/fasttime/time_fast.go
Normal file
@@ -0,0 +1,93 @@
|
||||
// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package fasttime
|
||||
|
||||
import (
|
||||
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"time"
|
||||
)
|
||||
|
||||
var sharedFastTime = NewFastTime()
|
||||
|
||||
func init() {
|
||||
if !teaconst.IsMain {
|
||||
return
|
||||
}
|
||||
|
||||
var ticker = time.NewTicker(200 * time.Millisecond)
|
||||
goman.New(func() {
|
||||
for range ticker.C {
|
||||
sharedFastTime = NewFastTime()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func Now() *FastTime {
|
||||
return sharedFastTime
|
||||
}
|
||||
|
||||
type FastTime struct {
|
||||
rawTime time.Time
|
||||
unixTime int64
|
||||
unixTimeMilli int64
|
||||
unixTimeMilliString string
|
||||
ymd string
|
||||
round5Hi string
|
||||
}
|
||||
|
||||
func NewFastTime() *FastTime {
|
||||
var rawTime = time.Now()
|
||||
|
||||
return &FastTime{
|
||||
rawTime: rawTime,
|
||||
unixTime: rawTime.Unix(),
|
||||
unixTimeMilli: rawTime.UnixMilli(),
|
||||
unixTimeMilliString: types.String(rawTime.UnixMilli()),
|
||||
ymd: timeutil.Format("Ymd", rawTime),
|
||||
round5Hi: timeutil.FormatTime("Hi", rawTime.Unix()/300*300),
|
||||
}
|
||||
}
|
||||
|
||||
// Unix 最快获取时间戳的方式,通常用在不需要特别精确时间戳的场景
|
||||
func (this *FastTime) Unix() int64 {
|
||||
return this.unixTime
|
||||
}
|
||||
|
||||
// UnixFloor 取整
|
||||
func (this *FastTime) UnixFloor(seconds int) int64 {
|
||||
return this.unixTime / int64(seconds) * int64(seconds)
|
||||
}
|
||||
|
||||
// UnixCell 取整并加1
|
||||
func (this *FastTime) UnixCell(seconds int) int64 {
|
||||
return this.unixTime/int64(seconds)*int64(seconds) + int64(seconds)
|
||||
}
|
||||
|
||||
// UnixNextMinute 获取下一分钟开始的时间戳
|
||||
func (this *FastTime) UnixNextMinute() int64 {
|
||||
return this.UnixCell(60)
|
||||
}
|
||||
|
||||
// UnixMilli 获取时间戳,精确到毫秒
|
||||
func (this *FastTime) UnixMilli() int64 {
|
||||
return this.unixTimeMilli
|
||||
}
|
||||
|
||||
func (this *FastTime) UnixMilliString() (int64, string) {
|
||||
return this.unixTimeMilli, this.unixTimeMilliString
|
||||
}
|
||||
|
||||
func (this *FastTime) Ymd() string {
|
||||
return this.ymd
|
||||
}
|
||||
|
||||
func (this *FastTime) Round5Hi() string {
|
||||
return this.round5Hi
|
||||
}
|
||||
|
||||
func (this *FastTime) Format(layout string) string {
|
||||
return timeutil.Format(layout, this.rawTime)
|
||||
}
|
||||
57
internal/utils/fasttime/time_fast_test.go
Normal file
57
internal/utils/fasttime/time_fast_test.go
Normal file
@@ -0,0 +1,57 @@
|
||||
// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package fasttime_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestFastTime_Unix(t *testing.T) {
|
||||
for i := 0; i < 5; i++ {
|
||||
var now = fasttime.Now()
|
||||
t.Log(now.Unix(), now.UnixMilli(), "real:", time.Now().Unix())
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFastTime_UnixMilli(t *testing.T) {
|
||||
t.Log(fasttime.Now().UnixMilliString())
|
||||
}
|
||||
|
||||
func TestFastTime_UnixFloor(t *testing.T) {
|
||||
var now = fasttime.Now()
|
||||
|
||||
var timestamp = time.Now().Unix()
|
||||
t.Log("floor 60:", timestamp, now.UnixFloor(60), timeutil.FormatTime("Y-m-d H:i:s", now.UnixFloor(60)))
|
||||
t.Log("ceil 60:", timestamp, now.UnixCell(60), timeutil.FormatTime("Y-m-d H:i:s", now.UnixCell(60)))
|
||||
t.Log("floor 300:", timestamp, now.UnixFloor(300), timeutil.FormatTime("Y-m-d H:i:s", now.UnixFloor(300)))
|
||||
t.Log("next minute:", now.UnixNextMinute(), timeutil.FormatTime("Y-m-d H:i:s", now.UnixNextMinute()))
|
||||
t.Log("day:", now.Ymd())
|
||||
t.Log("round 5 minute:", now.Round5Hi())
|
||||
}
|
||||
|
||||
func TestFastTime_Format(t *testing.T) {
|
||||
var now = fasttime.Now()
|
||||
t.Log(now.Format("Y-m-d H:i:s"))
|
||||
}
|
||||
|
||||
func BenchmarkNewFastTime(b *testing.B) {
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
var now = fasttime.Now()
|
||||
_ = now.Ymd()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkNewFastTime_Raw(b *testing.B) {
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
var now = time.Now()
|
||||
_ = timeutil.Format("Ymd", now)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1,65 +1,9 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"time"
|
||||
)
|
||||
|
||||
var unixTime = time.Now().Unix()
|
||||
var unixTimeMilli = time.Now().UnixMilli()
|
||||
var unixTimeMilliString = types.String(unixTimeMilli)
|
||||
var ymd = timeutil.Format("Ymd")
|
||||
var round5Hi = timeutil.FormatTime("Hi", time.Now().Unix()/300*300)
|
||||
|
||||
func init() {
|
||||
if !teaconst.IsMain {
|
||||
return
|
||||
}
|
||||
|
||||
var ticker = time.NewTicker(200 * time.Millisecond)
|
||||
goman.New(func() {
|
||||
for range ticker.C {
|
||||
unixTime = time.Now().Unix()
|
||||
unixTimeMilli = time.Now().UnixMilli()
|
||||
unixTimeMilliString = types.String(unixTimeMilli)
|
||||
ymd = timeutil.Format("Ymd")
|
||||
round5Hi = timeutil.FormatTime("Hi", time.Now().Unix()/300*300)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// UnixTime 最快获取时间戳的方式,通常用在不需要特别精确时间戳的场景
|
||||
func UnixTime() int64 {
|
||||
return unixTime
|
||||
}
|
||||
|
||||
// FloorUnixTime 取整
|
||||
func FloorUnixTime(seconds int) int64 {
|
||||
return UnixTime() / int64(seconds) * int64(seconds)
|
||||
}
|
||||
|
||||
// CeilUnixTime 取整并加1
|
||||
func CeilUnixTime(seconds int) int64 {
|
||||
return UnixTime()/int64(seconds)*int64(seconds) + int64(seconds)
|
||||
}
|
||||
|
||||
// NextMinuteUnixTime 获取下一分钟开始的时间戳
|
||||
func NextMinuteUnixTime() int64 {
|
||||
return CeilUnixTime(60)
|
||||
}
|
||||
|
||||
// UnixTimeMilli 获取时间戳,精确到毫秒
|
||||
func UnixTimeMilli() int64 {
|
||||
return unixTimeMilli
|
||||
}
|
||||
|
||||
func UnixTimeMilliString() (int64, string) {
|
||||
return unixTimeMilli, unixTimeMilliString
|
||||
}
|
||||
|
||||
// GMTUnixTime 计算GMT时间戳
|
||||
func GMTUnixTime(timestamp int64) int64 {
|
||||
_, offset := time.Now().Zone()
|
||||
@@ -71,13 +15,3 @@ func GMTTime(t time.Time) time.Time {
|
||||
_, offset := time.Now().Zone()
|
||||
return t.Add(-time.Duration(offset) * time.Second)
|
||||
}
|
||||
|
||||
// Ymd 读取YYYYMMDD
|
||||
func Ymd() string {
|
||||
return ymd
|
||||
}
|
||||
|
||||
// Round5Hi 读取5分钟间隔时间
|
||||
func Round5Hi() string {
|
||||
return round5Hi
|
||||
}
|
||||
|
||||
@@ -2,18 +2,10 @@ package utils_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestUnixTime(t *testing.T) {
|
||||
for i := 0; i < 5; i++ {
|
||||
t.Log(utils.UnixTime(), "real:", time.Now().Unix())
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGMTUnixTime(t *testing.T) {
|
||||
t.Log(utils.GMTUnixTime(time.Now().Unix()))
|
||||
}
|
||||
@@ -21,19 +13,3 @@ func TestGMTUnixTime(t *testing.T) {
|
||||
func TestGMTTime(t *testing.T) {
|
||||
t.Log(utils.GMTTime(time.Now()))
|
||||
}
|
||||
|
||||
func TestFloorUnixTime(t *testing.T) {
|
||||
var timestamp = time.Now().Unix()
|
||||
t.Log("floor 60:", timestamp, utils.FloorUnixTime(60), timeutil.FormatTime("Y-m-d H:i:s", utils.FloorUnixTime(60)))
|
||||
t.Log("ceil 60:", timestamp, utils.CeilUnixTime(60), timeutil.FormatTime("Y-m-d H:i:s", utils.CeilUnixTime(60)))
|
||||
t.Log("floor 300:", timestamp, utils.FloorUnixTime(300), timeutil.FormatTime("Y-m-d H:i:s", utils.FloorUnixTime(300)))
|
||||
t.Log("next minute:", utils.NextMinuteUnixTime())
|
||||
}
|
||||
|
||||
func TestYmd(t *testing.T) {
|
||||
t.Log(utils.Ymd())
|
||||
}
|
||||
|
||||
func TestRound5Hi(t *testing.T) {
|
||||
t.Log(utils.Round5Hi())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user