前言

之前用Delphi时,研究过延时及其时间精度,并写了篇文章——Delphi中的延时,当时是仅在windows平台下测试的,现在想用Lazarus分别在windowslinux平台测试对比下。

测试

测试环境

  • CPU:x86_64

  • win:win10

  • linux:debian 12.6 + xfce

  • ide:Lazarus 3.4 + fpc 3.2.2

测试设计

整体与之前的设计保持一致,增加了GetTickCount64的测试,Timer的测试有改动,具体如下:

  1. 假定系统时间是足够精确的,因此使用Now分别在延时前后获取系统当前时间来进行耗时评估。

  2. 为使测试更具代表性,每个测试点连续测试100次,取算术平均值。

  3. 1ms~100ms内,测试点步长为1ms,在100ms~1000ms内,测试点步长为10ms

  4. 为尽可能减小干扰,测试过程中未使用并行,SleepGetTickCountGetTickCount64未使用Application.ProcessMessages;Timer绕不开事件触发,使用了Application.ProcessMessages;

测试结果

windows

延时(ms) Sleep GetTickCount GetTickCount64 Timer
1 1.93 15.51 15.63 15.62
2 2.93 16.59 15.62 15.63
3 3.95 15.58 15.62 15.66
4 5.10 15.49 15.94 15.61
5 5.86 15.55 15.62 15.65
6 6.83 15.50 15.62 15.63
7 7.81 15.62 15.63 15.67
8 8.77 15.55 15.63 15.68
9 9.76 15.50 15.63 15.64
10 10.77 15.59 15.63 15.62
11 11.71 15.48 15.63 15.63
12 12.71 15.56 15.63 15.63
13 13.68 15.54 15.61 15.63
14 14.69 15.63 15.62 15.62
15 15.70 15.56 15.62 15.62
16 16.59 24.82 25.00 25.02
17 17.60 31.11 31.25 31.26
18 18.59 31.24 31.25 31.24
19 19.56 31.22 31.26 31.25
20 20.56 31.16 31.25 31.26
21 21.53 31.11 31.25 31.27
22 22.50 31.21 31.26 31.24
23 23.45 31.21 31.24 31.29
24 24.58 31.16 31.25 31.25
25 25.44 31.12 31.26 31.24
26 27.20 31.23 31.24 31.25
27 27.54 31.21 31.25 31.24
28 28.34 31.19 31.26 31.26
29 30.06 31.15 31.25 31.25
30 30.38 31.18 31.25 31.27
31 31.34 31.14 31.25 31.26
32 32.31 41.59 41.72 41.56
33 33.33 46.83 46.88 46.87
34 34.30 46.78 46.87 46.89
35 35.29 46.72 46.88 46.88
36 36.35 46.77 46.88 46.86
37 37.43 46.78 46.87 46.91
38 38.51 46.75 46.88 46.89
39 39.56 46.80 46.86 46.88
40 40.79 46.86 46.87 46.91
41 41.92 46.79 46.87 46.88
42 42.92 46.75 46.87 47.23
43 44.03 48.28 46.87 46.87
44 47.16 46.74 46.88 46.91
45 46.67 46.72 46.87 46.92
46 48.00 46.81 46.89 46.84
47 47.85 49.92 50.01 50.00
48 48.98 62.41 62.50 62.50
49 49.68 62.98 63.59 62.50
50 50.73 63.18 62.65 62.51
51 51.90 62.46 62.50 62.54
52 52.75 62.37 62.47 62.50
53 57.09 63.79 62.41 62.50
54 55.96 63.22 64.07 62.50
55 58.24 63.64 63.44 62.49
56 56.64 62.56 62.51 62.53
57 59.31 62.36 62.49 62.61
58 58.86 62.45 62.50 62.51
59 59.61 62.41 63.26 62.52
60 60.63 62.46 62.50 62.83
61 68.70 64.06 66.70 62.51
62 63.70 62.36 62.65 62.55
63 66.46 75.67 75.00 75.00
64 65.40 80.31 78.13 78.11
65 65.59 78.75 78.11 78.14
66 67.53 78.08 78.28 78.13
67 67.42 78.04 78.01 78.13
68 68.45 78.11 80.20 78.11
69 70.19 78.21 79.77 78.08
70 72.36 78.07 78.13 78.14
71 71.68 77.98 78.60 78.12
72 72.54 78.09 78.12 78.16
73 73.31 78.06 78.12 78.12
74 74.31 78.04 78.43 78.16
75 75.42 82.67 81.39 78.17
76 76.39 78.25 78.13 78.11
77 78.34 78.06 78.28 78.14
78 80.03 78.42 78.11 78.13
79 79.38 93.73 93.75 93.76
80 80.58 93.63 93.75 93.76
81 81.37 93.61 93.74 93.96
82 95.52 93.90 94.51 94.08
83 89.44 94.43 93.76 93.89
84 85.00 97.95 94.04 93.75
85 87.29 93.68 93.72 93.79
86 88.90 94.03 93.75 93.90
87 87.92 93.61 93.75 93.91
88 89.34 93.63 93.74 93.75
89 89.78 93.65 93.75 93.76
90 90.90 95.81 93.90 96.11
91 91.69 93.52 93.81 93.79
92 92.71 93.66 93.75 93.71
93 93.71 93.64 94.30 93.82
94 94.76 99.93 102.50 100.02
95 95.72 109.55 110.47 109.53
96 114.63 109.25 111.25 109.69
97 97.64 109.59 109.38 109.38
98 98.78 109.81 109.69 109.37
99 99.58 109.48 109.37 109.39
100 100.67 109.30 109.38 109.43
110 110.56 124.69 125.00 125.01
120 120.28 125.03 125.14 125.01
130 130.84 140.70 141.24 140.67
140 144.30 140.66 140.63 140.66
150 150.49 156.18 156.25 156.29
160 160.38 171.76 172.66 171.90
170 174.50 172.81 171.88 171.87
180 180.58 187.39 187.50 187.50
190 190.55 203.04 203.19 203.06
200 200.89 203.32 203.12 203.12
210 210.93 218.76 218.75 218.75
220 220.72 234.28 234.37 235.16
230 230.93 234.23 234.38 234.39
240 240.86 249.89 249.98 250.03
250 250.85 249.91 250.00 249.99
260 261.73 266.03 265.63 265.60
270 270.52 281.20 281.25 281.23
280 280.56 281.16 281.24 281.24
290 290.63 296.86 296.87 296.86
300 300.77 312.35 312.49 312.50
310 310.53 312.43 312.50 312.51
320 320.62 328.13 328.12 328.12
330 330.43 343.64 343.75 343.74
340 340.75 343.63 343.75 343.81
350 350.57 359.36 359.37 359.48
360 360.85 374.83 375.00 375.01
370 370.53 374.93 375.00 375.01
380 380.80 390.60 390.63 390.64
390 390.51 390.56 390.62 390.63
400 400.59 406.28 406.26 406.25
410 410.53 421.81 421.88 421.88
420 420.67 421.82 421.88 421.94
430 430.51 437.39 437.50 437.53
440 440.56 453.00 453.13 453.12
450 450.90 453.01 453.12 453.12
460 460.67 468.71 468.74 468.73
470 470.56 484.29 484.37 484.37
480 480.61 484.24 484.37 484.38
490 490.58 499.88 500.01 500.03
500 500.59 499.85 500.00 500.02
510 510.64 515.59 515.62 515.63
520 520.52 531.17 531.26 531.27
530 530.78 531.22 531.26 531.26
540 540.54 546.79 546.88 546.92
550 550.83 562.40 562.50 562.50
560 560.48 562.49 562.50 562.53
570 570.57 578.00 578.12 578.13
580 580.58 593.63 593.75 593.76
590 590.58 593.63 593.75 593.75
600 600.51 609.34 609.37 609.43
610 610.67 624.90 625.00 625.00
620 620.53 624.94 624.99 625.04
630 630.61 640.59 640.63 640.66
640 640.91 640.61 640.63 640.63
650 650.99 656.19 656.25 656.29
660 660.58 671.88 671.88 671.87
670 670.65 671.85 671.88 671.89
680 680.55 687.40 687.50 687.53
690 690.72 703.00 703.13 703.12
700 700.59 703.00 703.13 703.13
710 710.66 718.71 718.75 718.75
720 720.68 734.30 734.38 734.36
730 730.59 734.25 734.37 734.44
740 740.51 749.90 750.00 750.04
750 750.71 749.88 749.89 750.01
760 767.71 767.43 765.60 765.71
770 772.40 782.20 785.29 783.42
780 782.34 781.16 781.20 781.26
790 791.15 796.82 798.25 796.92
800 802.97 814.65 814.25 812.50
810 821.12 860.42 814.70 813.61
820 822.23 828.34 828.12 828.17
830 832.87 843.64 843.90 843.75
840 842.62 843.48 843.90 843.74
850 851.14 859.29 859.38 859.37
860 865.43 874.82 874.91 875.00
870 870.97 874.97 874.98 874.99
880 881.05 891.12 890.63 890.62
890 891.07 890.59 890.61 890.88
900 901.54 906.18 906.40 906.29
910 911.32 924.00 922.41 922.03
920 921.20 921.88 923.91 922.05
930 930.63 937.62 937.51 937.50
940 940.81 953.09 953.12 953.12
950 950.94 953.12 953.13 953.14
960 960.62 968.90 968.74 968.79
970 970.56 984.24 984.38 984.36
980 980.67 984.33 984.37 984.44
990 990.63 999.93 1000.00 1000.00
1000 1000.60 999.86 1000.00 1000.00

win常数坐标轴

win对数坐标轴

linux

延时(ms) Sleep GetTickCount GetTickCount64 Timer
1 1.38 1.03 1.11 1.48
2 2.67 2.10 2.16 2.15
3 3.57 3.23 3.18 3.36
4 4.49 4.02 4.32 4.13
5 5.54 5.27 5.52 5.38
6 6.73 6.12 6.20 6.33
7 7.57 7.41 7.27 7.28
8 8.52 8.16 8.11 8.21
9 9.52 9.17 9.16 9.51
10 10.46 10.40 10.28 10.65
11 11.52 11.17 11.29 11.48
12 12.70 12.06 12.13 12.65
13 13.50 13.61 13.27 13.29
14 14.83 14.32 14.08 16.12
15 15.50 15.07 15.54 15.45
16 16.51 16.09 16.08 16.10
17 17.60 17.15 17.06 17.31
18 18.47 18.15 18.10 18.88
19 19.46 19.23 19.15 19.49
20 20.47 20.20 20.07 20.47
21 21.50 21.21 21.47 21.45
22 22.42 22.08 22.08 22.32
23 23.59 23.13 23.30 23.36
24 24.43 24.19 24.10 24.25
25 25.46 25.11 25.13 25.35
26 26.50 26.23 26.10 26.33
27 27.43 27.08 27.09 27.32
28 28.39 28.32 28.05 28.26
29 29.57 29.15 29.20 29.14
30 30.55 30.27 30.21 30.37
31 31.41 31.37 31.42 31.45
32 32.42 32.11 32.08 32.25
33 33.48 33.07 33.16 33.20
34 34.40 34.10 34.10 34.41
35 35.54 35.09 35.03 35.35
36 36.40 36.01 36.07 36.29
37 37.46 37.16 37.19 37.29
38 38.59 38.12 38.23 38.30
39 39.47 39.19 39.19 39.48
40 40.40 40.04 40.05 40.32
41 41.49 41.27 41.20 41.45
42 42.52 42.14 42.16 42.41
43 43.54 43.03 43.04 43.14
44 44.48 44.10 44.03 44.22
45 45.60 45.10 45.11 45.20
46 46.50 46.16 46.18 46.53
47 47.57 47.16 47.18 47.25
48 48.53 48.09 48.22 48.36
49 49.60 49.24 49.44 49.18
50 50.44 50.10 50.09 50.24
51 51.50 51.55 51.11 51.69
52 52.54 52.17 52.36 52.45
53 53.45 53.36 53.43 53.64
54 54.47 54.14 54.31 54.30
55 55.60 55.13 55.24 55.22
56 56.56 56.03 56.19 56.17
57 57.54 57.08 57.53 57.36
58 58.58 58.18 58.08 58.63
59 59.54 59.05 59.14 59.04
60 60.49 60.03 60.07 60.54
61 61.62 61.74 61.47 61.46
62 62.53 62.25 62.93 62.91
63 63.56 64.00 63.40 63.72
64 64.44 64.25 64.58 65.36
65 65.56 65.25 65.11 65.15
66 66.50 66.14 66.12 66.24
67 67.43 67.65 67.15 67.32
68 68.38 68.05 68.36 68.59
69 70.16 70.39 70.13 69.78
70 70.58 70.78 70.56 70.78
71 71.45 71.58 71.24 72.08
72 72.48 72.16 72.03 72.81
73 73.43 73.12 73.18 73.28
74 74.49 74.13 74.37 74.47
75 75.35 75.09 75.12 75.13
76 76.44 76.40 76.10 76.32
77 77.50 77.46 77.12 77.57
78 78.40 78.27 78.12 78.31
79 79.47 79.13 79.11 79.45
80 80.41 80.13 80.12 80.37
81 81.44 81.14 81.23 81.34
82 82.55 82.19 82.25 84.44
83 83.71 83.34 83.19 83.45
84 84.50 84.11 84.42 84.85
85 85.74 85.58 85.44 85.70
86 86.58 86.03 86.14 86.15
87 87.69 87.18 87.12 87.23
88 88.46 88.04 97.47 88.22
89 89.55 90.00 89.64 89.70
90 91.42 91.01 90.71 90.37
91 91.64 91.16 92.14 91.42
92 92.49 92.15 92.07 92.17
93 93.49 93.23 93.57 93.47
94 94.52 94.19 94.38 94.47
95 95.57 95.30 95.28 95.31
96 96.55 96.11 96.06 96.48
97 97.52 97.09 97.73 97.46
98 98.71 98.07 98.35 98.55
99 99.60 99.13 99.18 99.71
100 100.83 100.16 100.30 100.78
110 110.49 110.31 110.42 110.22
120 120.47 120.19 121.13 121.35
130 130.70 130.48 130.26 130.21
140 140.69 140.56 140.07 140.85
150 150.48 150.27 150.28 150.23
160 160.52 160.07 160.07 160.41
170 170.43 170.20 170.58 170.41
180 180.52 180.05 180.24 180.87
190 190.41 190.21 190.12 190.25
200 200.40 200.09 200.27 200.30
210 210.55 210.60 210.46 210.43
220 220.54 220.09 220.05 220.27
230 230.47 230.14 230.20 230.71
240 240.68 240.22 240.08 240.21
250 250.51 250.56 250.06 250.30
260 260.45 260.22 260.10 260.30
270 270.43 270.06 270.14 270.32
280 280.41 280.12 280.09 280.22
290 290.48 290.48 290.40 290.23
300 300.53 300.10 300.24 300.22
310 310.50 310.24 310.14 310.45
320 320.44 320.12 320.15 320.19
330 330.46 330.10 330.18 330.27
340 340.41 340.11 340.05 340.40
350 350.48 350.19 350.14 350.44
360 360.45 360.13 360.12 360.20
370 370.50 370.20 370.13 370.22
380 380.43 380.07 380.05 380.27
390 390.44 390.05 390.08 390.26
400 400.42 400.15 400.03 400.20
410 410.46 410.12 410.10 410.28
420 420.45 420.00 420.12 420.28
430 430.48 430.10 430.08 430.21
440 440.45 440.02 440.09 440.11
450 450.51 450.22 450.11 450.39
460 460.48 460.10 460.14 460.29
470 470.55 470.28 470.08 470.62
480 480.50 480.24 480.37 480.61
490 490.56 490.06 490.08 490.17
500 500.54 500.13 500.03 500.40
510 510.56 510.13 510.18 510.35
520 520.43 520.09 520.09 520.23
530 530.51 530.18 530.19 530.26
540 540.51 540.10 540.16 540.40
550 550.52 550.13 550.20 550.30
560 560.45 560.08 560.15 560.20
570 570.44 570.12 570.33 570.30
580 580.38 580.19 580.05 580.18
590 590.41 590.08 590.05 590.27
600 600.41 600.08 600.07 600.26
610 610.49 610.33 610.20 610.27
620 620.50 619.99 620.14 620.36
630 630.45 630.11 630.08 630.32
640 640.41 640.18 640.08 640.13
650 650.51 650.19 650.19 650.23
660 660.39 660.04 660.04 660.16
670 670.49 670.37 670.18 670.25
680 680.39 680.13 680.21 680.24
690 690.45 690.30 690.10 690.26
700 700.41 700.23 700.08 700.19
710 710.44 710.09 710.21 710.28
720 720.45 720.06 720.04 720.16
730 730.45 730.07 730.13 730.23
740 740.44 740.19 740.11 740.08
750 750.42 750.12 750.26 750.41
760 760.46 760.06 760.15 760.28
770 770.74 770.45 770.42 770.58
780 780.90 780.30 780.33 780.63
790 792.37 790.56 790.35 790.54
800 800.57 800.29 800.37 800.33
810 810.71 810.34 810.49 812.78
820 820.70 820.41 821.46 823.84
830 830.63 830.22 830.50 830.55
840 840.55 840.19 840.26 840.52
850 850.67 850.37 850.27 850.47
860 860.48 860.25 860.58 860.41
870 870.52 870.73 870.84 870.86
880 880.51 880.22 880.15 880.55
890 890.59 890.27 890.30 890.53
900 902.35 900.28 900.28 900.38
910 910.54 910.27 910.51 910.55
920 920.56 920.58 920.28 920.57
930 930.70 930.29 930.33 930.61
940 941.74 940.11 940.20 940.76
950 950.74 950.09 950.19 950.26
960 960.44 960.09 960.17 960.39
970 970.46 970.09 970.12 970.39
980 980.44 980.11 980.14 980.29
990 990.52 990.06 990.44 990.33
1000 1000.46 1000.03 1000.23 1000.13

linux常数坐标轴

linux对数坐标轴

结论

  1. windows平台,GetTickCountGetTickCount64Timer三者差别不大,都是以大约15.6ms为一个梯度;Sleep相对精度更高一些。

  2. linux平台,SleepGetTickCountGetTickCount64Timer四者差别都不大,但SleepTimer的线性(即精度)略不如GetTickCountGetTickCount64

精度级别 方法
1 linux平台的GetTickCountGetTickCount64
2 两个平台的Sleeplinux平台的Timer
3 windows平台的GetTickCountGetTickCount64Timer