Sử dụng clock
, ProcessInfo.systemUptime
hoặc DispatchTime
cho thời gian khởi động đơn giản.
Theo như tôi biết, có ít nhất mười cách để đo thời gian trôi qua:
Đồng hồ đơn điệu dựa trên:
ProcessInfo.systemUptime
.
mach_absolute_time
với mach_timebase_info
như đã đề cập trong câu trả lời này .
clock()
trong tiêu chuẩn POSIX .
times()
trong tiêu chuẩn POSIX . (Quá phức tạp vì chúng ta cần xem xét thời gian của người dùng so với thời gian hệ thống và các quy trình con có liên quan.)
DispatchTime
(một trình bao bọc xung quanh API thời gian Mach) như được JeremyP đề cập trong câu trả lời được chấp nhận.
CACurrentMediaTime()
.
Đồng hồ treo tường dựa trên:
(không bao giờ sử dụng chúng cho số liệu: xem bên dưới tại sao)
NSDate
/ Date
như được đề cập bởi những người khác.
CFAbsoluteTime
như đã đề cập bởi những người khác.
DispatchWallTime
.
gettimeofday()
trong tiêu chuẩn POSIX .
Tùy chọn 1, 2 và 3 được xây dựng dưới đây.
Tùy chọn 1: API thông tin quy trình trong Foundation
do {
let info = ProcessInfo.processInfo
let begin = info.systemUptime
// do something
let diff = (info.systemUptime - begin)
}
nơi diff:NSTimeInterval
là thời gian trôi qua bằng giây.
Tùy chọn 2: API Mach C
do {
var info = mach_timebase_info(numer: 0, denom: 0)
mach_timebase_info(&info)
let begin = mach_absolute_time()
// do something
let diff = Double(mach_absolute_time() - begin) * Double(info.numer) / Double(info.denom)
}
nơi diff:Double
là thời gian trôi qua bằng nano giây.
Tùy chọn 3: API đồng hồ POSIX
do {
let begin = clock()
// do something
let diff = Double(clock() - begin) / Double(CLOCKS_PER_SEC)
}
nơi diff:Double
là thời gian trôi qua bằng giây.
Tại sao không phải là đồng hồ treo tường cho thời gian đã trôi qua?
Trong tài liệu của CFAbsoluteTimeGetCurrent
:
Các cuộc gọi liên tục đến chức năng này không đảm bảo kết quả tăng đơn điệu.
Lý do là tương tự như currentTimeMillis
vs nanoTime
trong Java :
Bạn không thể sử dụng cái này cho mục đích khác. Lý do là không có đồng hồ máy tính nào là hoàn hảo; nó luôn luôn trôi và đôi khi cần phải được sửa chữa. Việc hiệu chỉnh này có thể xảy ra bằng tay hoặc trong trường hợp của hầu hết các máy, có một quá trình chạy và liên tục đưa ra các hiệu chỉnh nhỏ cho đồng hồ hệ thống ("đồng hồ treo tường"). Những xu hướng này thường xảy ra. Một điều chỉnh như vậy xảy ra bất cứ khi nào có một bước nhảy vọt thứ hai.
Ở đây CFAbsoluteTime
cung cấp thời gian đồng hồ treo tường thay vì thời gian khởi động. NSDate
là thời gian đồng hồ treo tường là tốt.
sqrt(number)
thay vào đónumber
và bạn có thể tiết kiệm thêm một chút thời gian - nhưng có nhiều ý tưởng tối ưu hóa việc tìm kiếm các số nguyên tố.