【发布时间】:2015-01-28 18:05:39
【问题描述】:
我有很多日期时间值作为字符串传入我的 golang 程序。 格式固定位数:
2006/01/02 15:04:05
我开始使用 time.Parse 函数解析这些日期
const dtFormat = "2006/01/02 15:04:05"
func ParseDate1(strdate string) (time.Time, error) {
return time.Parse(dtFormat, strdate)
}
但我的程序出现了一些性能问题。因此,考虑到我的格式是固定的,我尝试通过编写自己的解析函数来调整它:
func ParseDate2(strdate string) (time.Time, error) {
year, _ := strconv.Atoi(strdate[:4])
month, _ := strconv.Atoi(strdate[5:7])
day, _ := strconv.Atoi(strdate[8:10])
hour, _ := strconv.Atoi(strdate[11:13])
minute, _ := strconv.Atoi(strdate[14:16])
second, _ := strconv.Atoi(strdate[17:19])
return time.Date(year, time.Month(month), day, hour, minute, second, 0, time.UTC), nil
}
最后我在这两个函数之上做了一个基准测试,得到了以下结果:
BenchmarkParseDate1 5000000 343 ns/op
BenchmarkParseDate2 10000000 248 ns/op
这是 27% 的性能提升。 在性能方面是否有更好的方法可以改善此类日期时间解析?
【问题讨论】:
-
需要解析多少个日期?
-
我通过 zmq push/pull 接收实时日志。这是一个连续的流。我批量记录行以限制事务数。主程序在峰值时间以 5000 TPS 记录。正常情况下为 500 TPS。
-
如果您需要读取数据,您可以将日期存储为字符串,然后再将它们转换为实际日期吗?如果这是对某种仪表板的实时更新,您真的需要每秒更新仪表板 5000 次吗?
-
我想用 Max,Min,Average 生成实时图表。如果可能的话,我还计划做更多的数学运算。因此,如果可能的话,我想避免任何数据丢失。但我理解你的意思,我需要检查在大量输入的情况下删除部分指标是否会影响我的数据。
-
"我想用 Max,Min,Average 生成实时图表。"。我也想要很多东西!你的cost–benefit analysis 在哪里。如果钱不是问题,买一台更大的电脑。否则,请现实一点。
标签: performance parsing date time go