Tôi đã xảy ra trên nguồn cho chức năng gmtime của Minix. Tôi đã quan tâm đến bit tính số năm từ ngày kể từ thời đại. Dưới đây là ruột của bit:Tại sao gmtime được triển khai theo cách này?
http://www.raspberryginger.com/jbailey/minix/html/gmtime_8c-source.html
http://www.raspberryginger.com/jbailey/minix/html/loc__time_8h-source.html
#define EPOCH_YR 1970
#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400)))
#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365)
int year = EPOCH_YR;
while (dayno >= YEARSIZE(year)) {
dayno -= YEARSIZE(year);
year++;
}
Dường như các thuật toán là O (n), trong đó n là khoảng cách từ các thời đại. Ngoài ra, có vẻ như LEAPYEAR phải được tính riêng cho mỗi năm – hàng chục lần cho các ngày hiện tại và nhiều hơn nữa cho những ngày xa trong tương lai. Tôi đã có thuật toán sau đây để làm điều tương tự (trong trường hợp này từ thời đại theo tiêu chuẩn ISO-9601 (Năm 0 = 1 BC) chứ không phải là UNIX kỷ nguyên):
#define CYCLE_1 365
#define CYCLE_4 (CYCLE_1 * 4 + 1)
#define CYCLE_100 (CYCLE_4 * 25 - 1)
#define CYCLE_400 (CYCLE_100 * 4 + 1)
year += 400 * (dayno/CYCLE_400)
dayno = dayno % CYCLE_400
year += 100 * (dayno/CYCLE_100)
dayno = dayno % CYCLE_100
year += 4 * (dayno/CYCLE_4)
dayno = dayno % CYCLE_4
year += 1 * (dayno/CYCLE_1)
dayno = dayno % CYCLE_1
này chạy trong thời gian O (1) cho ngày bất kỳ , và có vẻ như nó sẽ nhanh hơn ngay cả đối với những ngày hợp lý gần năm 1970.
Vì vậy, giả sử các nhà phát triển Minix là những người thông minh đã làm theo cách của họ vì lý do và có thể biết nhiều hơn về C so với tôi , tại sao?
Nó * trông * như nó sẽ nhanh hơn. Bạn cần phải suy nghĩ về kiến trúc của bạn và làm thế nào nhanh chóng một số hướng dẫn như nhân là và làm thế nào tốt một dự đoán chi nhánh bạn có là (hầu hết là rất tốt). @jim mcnamara có một số kết quả thú vị. – BobbyShaftoe