Schnelle Startzeit für Go
f , err := strftime . New ( `.... pattern ...` )
if err := f . Format ( buf , time . Now ()); err != nil {
log . Println ( err . Error ())
}
Die Ziele dieser Bibliothek sind
Nimmt das Muster und die Zeit und formatiert es. Bei dieser Funktion handelt es sich um eine Hilfsfunktion, die das Muster bei jedem Aufruf der Funktion neu kompiliert. Wenn Sie im Voraus wissen, dass Sie dasselbe Muster mehrmals formatieren werden, sollten Sie New
verwenden, um ein Strftime
-Objekt zu erstellen und es wiederzuverwenden.
Nimmt das Muster und erstellt ein neues Strftime
Objekt.
Gibt die Musterzeichenfolge zurück, die zum Erstellen dieses Strftime
Objekts verwendet wurde
Formatiert die Zeit gemäß dem vorkompilierten Muster und schreibt das Ergebnis in den angegebenen io.Writer
Formatiert die Zeit gemäß dem vorkompilierten Muster und gibt die Ergebniszeichenfolge zurück.
Muster | Beschreibung |
---|---|
%A | nationale Darstellung des vollständigen Wochentagsnamens |
%A | nationale Darstellung des abgekürzten Wochentags |
%B | nationale Darstellung des vollständigen Monatsnamens |
%B | nationale Darstellung des abgekürzten Monatsnamens |
%C | (Jahr / 100) als Dezimalzahl; Einzelnen Ziffern wird eine Null vorangestellt |
%C | nationale Darstellung von Uhrzeit und Datum |
%D | entspricht %m/%d/%y |
%D | Tag des Monats als Dezimalzahl (01-31) |
%e | der Tag des Monats als Dezimalzahl (1-31); Einzelnen Ziffern wird ein Leerzeichen vorangestellt |
%F | entspricht %Y-%m-%d |
%H | die Stunde (24-Stunden-Uhr) als Dezimalzahl (00-23) |
%H | das Gleiche wie %b |
%ICH | die Stunde (12-Stunden-Uhr) als Dezimalzahl (01-12) |
%J | der Tag des Jahres als Dezimalzahl (001-366) |
%k | die Stunde (24-Stunden-Uhr) als Dezimalzahl (0-23); Einzelnen Ziffern wird ein Leerzeichen vorangestellt |
%l | die Stunde (12-Stunden-Uhr) als Dezimalzahl (1-12); Einzelnen Ziffern wird ein Leerzeichen vorangestellt |
%M | die Minute als Dezimalzahl (00-59) |
%M | der Monat als Dezimalzahl (01-12) |
%N | eine neue Zeile |
%P | nationale Vertretung entweder „ante meridiem“ (am) oder „post meridiem“ (pm), je nach Bedarf. |
%R | entspricht %H:%M |
%R | entspricht %I:%M:%S %p |
%S | die Sekunde als Dezimalzahl (00-60) |
%T | entspricht %H:%M:%S |
%T | eine Registerkarte |
%U | die Wochennummer des Jahres (Sonntag als erster Tag der Woche) als Dezimalzahl (00-53) |
%u | der Wochentag (Montag als erster Tag der Woche) als Dezimalzahl (1-7) |
%V | die Wochennummer des Jahres (Montag als erster Tag der Woche) als Dezimalzahl (01-53) |
%v | entspricht %e-%b-%Y |
%W | die Wochennummer des Jahres (Montag als erster Tag der Woche) als Dezimalzahl (00-53) |
%w | der Wochentag (Sonntag als erster Tag der Woche) als Dezimalzahl (0-6) |
%X | Landesvertretung der damaligen Zeit |
%X | nationale Darstellung des Datums |
%Y | das Jahr mit Jahrhundert als Dezimalzahl |
%y | das Jahr ohne Jahrhundert als Dezimalzahl (00-99) |
%Z | der Name der Zeitzone |
%z | der Zeitzonenversatz von UTC |
%% | A '%' |
Diese Bibliothek versucht im Allgemeinen, POSIX-kompatibel zu sein, aber manchmal benötigt man einfach die eine oder andere zusätzliche Spezifikation, die relativ weit verbreitet ist, aber nicht in der POSIX-Spezifikation enthalten ist.
POSIX gibt beispielsweise nicht an, wie Millisekunden ausgedruckt werden, aber gängige Implementierungen ermöglichen %f
oder %L
, dies zu erreichen.
Für diese Fälle kann strftime.Strftime
so konfiguriert werden, dass ein benutzerdefinierter Satz von Spezifikationen verwendet wird:
ss := strftime.NewSpecificationSet()
ss.Set('L', ...) // provide implementation for `%L`
// pass this new specification set to the strftime instance
p, err := strftime.New(`%L`, strftime.WithSpecificationSet(ss))
p.Format(..., time.Now())
Die Implementierung muss die Appender
Schnittstelle implementieren
type Appender interface {
Append([]byte, time.Time) []byte
}
Für häufig verwendete Erweiterungen wie das Millisekundenbeispiel und den Unix-Zeitstempel stellen wir eine Standardimplementierung bereit, damit der Benutzer einen der folgenden Schritte ausführen kann:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%L`,
strftime.WithSpecification('L', strftime.Milliseconds),
)
// (2) Pass an option that knows to use strftime.Milliseconds
p, err := strftime.New(
`%L`,
strftime.WithMilliseconds('L'),
)
Ähnliches gilt für den Unix-Zeitstempel:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%s`,
strftime.WithSpecification('s', strftime.UnixSeconds),
)
// (2) Pass an option that knows to use strftime.UnixSeconds
p, err := strftime.New(
`%s`,
strftime.WithUnixSeconds('s'),
)
Wenn eine gemeinsame Spezifikation fehlt, können Sie gerne eine PR einreichen (stellen Sie aber bitte sicher, dass Sie verteidigen können, wie „gemeinsam“ sie ist).
Milliseconds
(zugehörige Option: WithMilliseconds
);
Microseconds
(verwandte Option: WithMicroseconds
);
UnixSeconds
(zugehörige Option: WithUnixSeconds
).
Die folgenden Benchmarks wurden separat ausgeführt, da einige Bibliotheken CGO auf bestimmten Plattformen verwendeten (insbesondere die Fastly-Version).
// On my OS X 10.14.6, 2.3 GHz Intel Core i5, 16GB memory.
// go version go1.13.4 darwin/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka-4 297471 3905 ns/op 257 B/op 20 allocs/op
BenchmarkJehiah-4 818444 1773 ns/op 256 B/op 17 allocs/op
BenchmarkFastly-4 2330794 550 ns/op 80 B/op 5 allocs/op
BenchmarkLestrrat-4 916365 1458 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString-4 2527428 546 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter-4 537422 2155 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 25.618s
// On a host on Google Cloud Platform, machine-type: f1-micro (vCPU x 1, memory: 0.6GB)
// (Yes, I was being skimpy)
// Linux <snip> 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u1 (2019-09-20) x86_64 GNU/Linux
// go version go1.13.4 linux/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka 254997 4726 ns/op 256 B/op 20 allocs/op
BenchmarkJehiah 659289 1882 ns/op 256 B/op 17 allocs/op
BenchmarkFastly 389150 3044 ns/op 224 B/op 13 allocs/op
BenchmarkLestrrat 699069 1780 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString 2081594 589 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter 825763 1480 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 11.355s
Diese Bibliothek ist viel schneller als andere Bibliotheken , WENN Sie das Formatmuster wiederverwenden können.
Hier ist die kommentierte Liste der Benchmark-Ergebnisse. Sie können deutlich sehen, dass die (Wieder-)Verwendung eines Strftime
-Objekts und die Erstellung einer Zeichenfolge am schnellsten ist. Das Schreiben in einen io.Writer
scheint etwas träge zu sein, aber da derjenige, der die Zeichenfolge erzeugt, fast genau das Gleiche tut, glauben wir, dass dies lediglich der Mehraufwand beim Schreiben in einen io.Writer
ist
Pfad importieren | Punktzahl | Notiz |
---|---|---|
github.com/lestrrat-go/strftime | 3000000 | Verwenden von FormatString() (zwischengespeichert) |
github.com/fastly/go-utils/strftime | 2000000 | Reine Go-Version unter OS X |
github.com/lestrrat-go/strftime | 1000000 | Verwenden von Format() (NICHT zwischengespeichert) |
github.com/jehiah/go-strftime | 1000000 | |
github.com/fastly/go-utils/strftime | 1000000 | cgo-Version unter Linux |
github.com/lestrrat-go/strftime | 500000 | Verwenden von Format() (zwischengespeichert) |
github.com/tebeka/strftime | 300000 |
Abhängig von Ihrem Muster kann diese Geschwindigkeit jedoch variieren. Wenn Sie feststellen, dass ein bestimmtes Muster träge erscheint, senden Sie bitte Patches oder Tests ein.
Bitte beachten Sie auch, dass dieser Benchmark nur die Teilmenge der Konvertierungsspezifikationen verwendet, die von ALLEN verglichenen Bibliotheken unterstützt werden.
Was Sie bei zukünftigen Leistungsvergleichen berücksichtigen sollten:
%specification
wird verarbeitet?