Waktu strftime yang cepat untuk Go
f , err := strftime . New ( `.... pattern ...` )
if err := f . Format ( buf , time . Now ()); err != nil {
log . Println ( err . Error ())
}
Tujuan dari perpustakaan ini adalah
Mengambil pola dan waktu, dan memformatnya. Fungsi ini adalah fungsi utilitas yang mengkompilasi ulang pola setiap kali fungsi tersebut dipanggil. Jika Anda mengetahui sebelumnya bahwa Anda akan memformat pola yang sama beberapa kali, pertimbangkan untuk menggunakan New
untuk membuat objek Strftime
dan menggunakannya kembali.
Mengambil pola dan membuat objek Strftime
baru.
Mengembalikan string pola yang digunakan untuk membuat objek Strftime
ini
Memformat waktu sesuai dengan pola yang telah dikompilasi sebelumnya, dan menulis hasilnya ke io.Writer
yang ditentukan
Memformat waktu sesuai dengan pola yang telah dikompilasi sebelumnya, dan mengembalikan string hasil.
pola | keterangan |
---|---|
%A | representasi nasional dari nama hari kerja lengkap |
%A | representasi nasional hari kerja yang disingkat |
%B | representasi nasional nama bulan penuh |
%B | representasi nasional dari nama bulan yang disingkat |
%C | (tahun / 100) sebagai angka desimal; satu digit diawali dengan angka nol |
%C | representasi nasional waktu dan tanggal |
%D | setara dengan %m/%d/%y |
%D | hari dalam sebulan sebagai angka desimal (01-31) |
%e | hari dalam bulan sebagai angka desimal (1-31); satu digit didahului dengan tanda kosong |
%F | setara dengan %Y-%m-%d |
%H | jam (jam 24 jam) sebagai angka desimal (00-23) |
%H | sama dengan %b |
%SAYA | jam (jam 12 jam) sebagai angka desimal (01-12) |
%J | hari dalam setahun sebagai angka desimal (001-366) |
%k | jam (jam 24 jam) sebagai angka desimal (0-23); satu digit didahului dengan tanda kosong |
%l | jam (jam 12 jam) sebagai angka desimal (1-12); satu digit didahului dengan tanda kosong |
%M | menit sebagai angka desimal (00-59) |
%M | bulan sebagai angka desimal (01-12) |
%N | baris baru |
%P | representasi nasional baik "ante meridiem" (am) atau "post meridiem" (pm) sebagaimana mestinya. |
%R | setara dengan %H:%M |
%R | setara dengan %I:%M:%S %p |
%S | yang kedua sebagai angka desimal (00-60) |
%T | setara dengan %H:%M:%S |
%T | sebuah tab |
%U | nomor minggu dalam setahun (Minggu sebagai hari pertama dalam seminggu) sebagai angka desimal (00-53) |
%u | hari kerja (Senin sebagai hari pertama dalam seminggu) sebagai angka desimal (1-7) |
%V | nomor minggu dalam setahun (Senin sebagai hari pertama dalam seminggu) sebagai angka desimal (01-53) |
%v | setara dengan %e-%b-%Y |
%W | nomor minggu dalam setahun (Senin sebagai hari pertama dalam seminggu) sebagai angka desimal (00-53) |
%w | hari kerja (Minggu sebagai hari pertama dalam seminggu) sebagai angka desimal (0-6) |
%X | representasi nasional pada saat itu |
%X | representasi nasional pada tanggal tersebut |
%Y | tahun dengan abad sebagai angka desimal |
%y | tahun tanpa abad sebagai angka desimal (00-99) |
%Z | nama zona waktu |
%z | zona waktu diimbangi dari UTC |
%% | A '%' |
Pustaka ini secara umum mencoba untuk memenuhi persyaratan POSIX, namun terkadang Anda hanya memerlukan satu atau dua spesifikasi tambahan yang relatif banyak digunakan tetapi tidak termasuk dalam spesifikasi POSIX.
Misalnya, POSIX tidak menentukan cara mencetak milidetik, namun implementasi populer memungkinkan %f
atau %L
untuk mencapai hal ini.
Untuk contoh tersebut, strftime.Strftime
dapat dikonfigurasi untuk menggunakan serangkaian spesifikasi khusus:
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())
Implementasinya harus mengimplementasikan antarmuka Appender
, yaitu
type Appender interface {
Append([]byte, time.Time) []byte
}
Untuk ekstensi yang umum digunakan seperti contoh milidetik dan stempel waktu Unix, kami menyediakan implementasi default sehingga pengguna dapat melakukan salah satu hal berikut:
// (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'),
)
Demikian pula untuk Stempel Waktu Unix:
// (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'),
)
Jika spesifikasi umum tidak ada, silakan mengirimkan PR (tapi pastikan untuk dapat mempertahankan seberapa "umumnya" spesifikasi tersebut)
Milliseconds
(opsi terkait: WithMilliseconds
);
Microseconds
(opsi terkait: WithMicroseconds
);
UnixSeconds
(opsi terkait: WithUnixSeconds
).
Tolok ukur berikut dijalankan secara terpisah karena beberapa perpustakaan menggunakan cgo pada platform tertentu (khususnya, versi fastly)
// 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
Pustaka ini jauh lebih cepat dibandingkan pustaka lain JIKA Anda dapat menggunakan kembali pola formatnya.
Berikut daftar beranotasi dari hasil benchmark. Anda dapat dengan jelas melihat bahwa (kembali) menggunakan objek Strftime
dan menghasilkan string adalah yang tercepat. Menulis ke io.Writer
tampaknya agak lamban, tetapi karena pembuat string melakukan hal yang hampir persis sama, kami yakin ini hanyalah biaya tambahan untuk menulis ke io.Writer
Jalur Impor | Skor | Catatan |
---|---|---|
github.com/lestrrat-go/strftime | 3000000 | Menggunakan FormatString() (di-cache) |
github.com/fastly/go-utils/strftime | 2000000 | Versi go murni di OS X |
github.com/lestrrat-go/strftime | 1000000 | Menggunakan Format() (TIDAK di-cache) |
github.com/jehiah/go-strftime | 1000000 | |
github.com/fastly/go-utils/strftime | 1000000 | versi cgo di Linux |
github.com/lestrrat-go/strftime | 500000 | Menggunakan Format() (di-cache) |
github.com/tebeka/strftime | 300000 |
Namun, bergantung pada pola Anda, kecepatan ini mungkin berbeda. Jika Anda menemukan pola tertentu yang tampak lamban, silakan kirimkan patch atau tes.
Harap perhatikan juga bahwa tolok ukur ini hanya menggunakan subset spesifikasi konversi yang didukung oleh SEMUA perpustakaan yang dibandingkan.
Hal-hal yang perlu dipertimbangkan saat membuat perbandingan kinerja di masa mendatang:
%specification
manakah yang ditanganinya?