Ho molti valori datetime ricevuti come stringa nel mio programma golang. Il formato è fisso in numero di cifre:Il modo migliore per analizzare data e ora in golang
2006/01/02 15:04:05
ho iniziato ad analizzare queste date con la funzione di time.Parse
const dtFormat = "2006/01/02 15:04:05"
func ParseDate1(strdate string) (time.Time, error) {
return time.Parse(dtFormat, strdate)
}
ma ho avuto qualche problema prestazioni con il mio programma. Così ho cercato di sintonizzare da scrittura la mia funzione di parsing, tenendo conto che il mio formato è tipo di fisso:
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
}
finalmente ho fatto un punto di riferimento in cima a queste 2 funzioni ed ho ottenuto il seguente risultato:
BenchmarkParseDate1 5000000 343 ns/op
BenchmarkParseDate2 10000000 248 ns/op
Questo è un miglioramento delle prestazioni del 27%. Esiste un modo migliore in termini di prestazioni che potrebbe migliorare l'analisi di data e ora?
Quante date devono essere analizzate? –
Sto ricevendo i log live tramite zmq push/pull. È un flusso continuo. I bulk log lines per limitare il numero di transazioni. Il programma principale registra a 5000 TPS al picco. In condizioni normali è 500 TPS. – dbenque
Puoi semplicemente memorizzare le date come una stringa e convertirle in date effettive dopo, se hai mai bisogno di leggere i dati? Se si tratta di un aggiornamento live di un dashboard di qualche tipo, è necessario aggiornare la dashboard 5000 volte al secondo? –