time: Durasi, pengukuran, dan waktu tunggu
Jelaskan perbedaan antara satuan Duration dan realtime·monotonic clock.
Wave Foundation
Duration
Duration di std::time::duration memiliki seconds dan nanoseconds. Rentang nanoseconds yang dinormalisasi adalah 0 hingga 999999999. 1000 milidetik sama dengan 1 detik.
time_duration_from_ms(milliseconds: i64) -> Duration
time_duration_from_seconds(seconds: i64) -> Duration
time_duration_checked_add(left: Duration, right: Duration) -> DurationResult
time_duration_to_ns(value: Duration) -> DurationValueResult
Operasi checked dan hasil konversi bilangan bulat meliputi ok dan value. Mengganti nilai Duration yang lebar dengan satu nilai nanodetik i64 mungkin di luar jangkauan, jadi periksalah ok terlebih dahulu.
Bedakan antara pengukuran dan penglihatan
std::time::clock hingga time_now_realtime(tp: ptr<TimeSpec>) -> i64 sesuai dengan waktu kalender. Gunakan time_now_monotonic untuk pengukuran waktu yang telah berlalu, karena ini dapat berubah seiring koreksi jam sistem. Penyimpanan keluaran disediakan oleh pemanggil dan hanya membaca sec/nsec jika statusnya berhasil.
std::time::sleep
time_sleep(duration: Duration) -> i64
time_sleep_ms(ms: i64) -> i64
time_sleep_us(us: i64) -> i64
time_sleep_ns(ns: i64) -> i64
time_sleep_seconds(seconds: i64) -> i64
Penantian negatif adalah sebuah kesalahan, dan 0 adalah kesuksesan langsung. Setelah interruption, hanya sisa waktu hingga monotonic deadline yang akan ditunggu. Karena waktu bangun sebenarnya mungkin tertunda karena penjadwalan, ini tidak digunakan sebagai fungsi yang menjamin waktu eksekusi yang tepat. Memanggil sleep sinkron dalam tugas async dapat mencegah kemajuan eksekutor, jadi pilih task::sleep_ms.
Contoh konversi satuan
import("std::time::duration")::{
Duration, DurationValueResult, time_duration_from_ms, time_duration_to_ns
};
fun main() -> i32 {
var duration: Duration = time_duration_from_ms(1500);
var value: DurationValueResult = time_duration_to_ns(duration);
if (!value.ok) {
return 1;
}
println("{} {}", duration.seconds, duration.nanoseconds);
println("{}", value.value);
return 0;
}
Hasil eksekusi:
1 500000000
1500000000
Tambahkan waktu dan ubah satuan
750 ms dan 800 ms berjumlah 1 detik dan 55.0000000 nanodetik. Daripada menambahkan detik dan nanodetik secara terpisah, Anda dapat menggunakan checked_add untuk memeriksa carry dan range secara bersamaan.
import("std::time::duration")::{
Duration,
DurationResult,
DurationValueResult,
time_duration_from_ms,
time_duration_checked_add,
time_duration_to_ms
};
fun main() -> i32 {
var first: Duration = time_duration_from_ms(750);
var second: Duration = time_duration_from_ms(800);
var sum: DurationResult = time_duration_checked_add(first, second);
if (!sum.ok) {
return 1;
}
var milliseconds: DurationValueResult = time_duration_to_ms(sum.value);
if (!milliseconds.ok) {
return 2;
}
println("{}s {}ns", sum.value.seconds, sum.value.nanoseconds);
println("{}ms", milliseconds.value);
return 0;
}
Hasil eksekusi:
1s 550000000ns
1550ms
interval waktu negatif
Duration juga mewakili angka negatif. -1ms dinormalisasi menjadi seconds=-1, nanoseconds=999000000. Gabungan kedua bidang tersebut bernilai negatif 1 milidetik. Anda tidak boleh menilai bahwa ini adalah angka positif hanya dengan melihat kolom nanoseconds.
Angka negatif valid dalam penghitungan interval waktu, tetapi meneruskan angka negatif ke sleep merupakan kesalahan. Saat menghitung sisa waktu tunggu, jika batas waktu tersebut telah terlewati maka proses selanjutnya akan dilanjutkan tanpa menunggu.
Pilih waktu API
| tujuan | pilih | Apa arti hasilnya |
|---|---|---|
| Waktu berlalu antara dua titik waktu | monotonic clock | Interval tidak bergantung pada koreksi visual sistem |
| waktu kalender sebenarnya | realtime clock | Waktu yang ditentukan oleh sistem |
| Menunggu program sinkron | time_sleep_ms |
Alur panggilan antri |
| async Menunggu tugas | task::sleep_ms |
Meneruskan peluang eksekusi ke tugas lain |
Bahkan jam yang mengembalikan nanodetik tidak berarti presisi pengukuran sebenarnya adalah 1 nanodetik. Saat membandingkan kinerja, ukur total waktu untuk mengulangi tugas singkat beberapa kali, dan pindahkan tugas yang tidak terkait dengan target pengukuran, seperti input/output, keluar dari bagian tersebut.