在Lazarus中分析Windows和Linux的延时

132 阅读4分钟

文章首发于个人博客

前言

之前用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)SleepGetTickCountGetTickCount64Timer
11.9315.5115.6315.62
22.9316.5915.6215.63
33.9515.5815.6215.66
45.1015.4915.9415.61
55.8615.5515.6215.65
66.8315.5015.6215.63
77.8115.6215.6315.67
88.7715.5515.6315.68
99.7615.5015.6315.64
1010.7715.5915.6315.62
1111.7115.4815.6315.63
1212.7115.5615.6315.63
1313.6815.5415.6115.63
1414.6915.6315.6215.62
1515.7015.5615.6215.62
1616.5924.8225.0025.02
1717.6031.1131.2531.26
1818.5931.2431.2531.24
1919.5631.2231.2631.25
2020.5631.1631.2531.26
2121.5331.1131.2531.27
2222.5031.2131.2631.24
2323.4531.2131.2431.29
2424.5831.1631.2531.25
2525.4431.1231.2631.24
2627.2031.2331.2431.25
2727.5431.2131.2531.24
2828.3431.1931.2631.26
2930.0631.1531.2531.25
3030.3831.1831.2531.27
3131.3431.1431.2531.26
3232.3141.5941.7241.56
3333.3346.8346.8846.87
3434.3046.7846.8746.89
3535.2946.7246.8846.88
3636.3546.7746.8846.86
3737.4346.7846.8746.91
3838.5146.7546.8846.89
3939.5646.8046.8646.88
4040.7946.8646.8746.91
4141.9246.7946.8746.88
4242.9246.7546.8747.23
4344.0348.2846.8746.87
4447.1646.7446.8846.91
4546.6746.7246.8746.92
4648.0046.8146.8946.84
4747.8549.9250.0150.00
4848.9862.4162.5062.50
4949.6862.9863.5962.50
5050.7363.1862.6562.51
5151.9062.4662.5062.54
5252.7562.3762.4762.50
5357.0963.7962.4162.50
5455.9663.2264.0762.50
5558.2463.6463.4462.49
5656.6462.5662.5162.53
5759.3162.3662.4962.61
5858.8662.4562.5062.51
5959.6162.4163.2662.52
6060.6362.4662.5062.83
6168.7064.0666.7062.51
6263.7062.3662.6562.55
6366.4675.6775.0075.00
6465.4080.3178.1378.11
6565.5978.7578.1178.14
6667.5378.0878.2878.13
6767.4278.0478.0178.13
6868.4578.1180.2078.11
6970.1978.2179.7778.08
7072.3678.0778.1378.14
7171.6877.9878.6078.12
7272.5478.0978.1278.16
7373.3178.0678.1278.12
7474.3178.0478.4378.16
7575.4282.6781.3978.17
7676.3978.2578.1378.11
7778.3478.0678.2878.14
7880.0378.4278.1178.13
7979.3893.7393.7593.76
8080.5893.6393.7593.76
8181.3793.6193.7493.96
8295.5293.9094.5194.08
8389.4494.4393.7693.89
8485.0097.9594.0493.75
8587.2993.6893.7293.79
8688.9094.0393.7593.90
8787.9293.6193.7593.91
8889.3493.6393.7493.75
8989.7893.6593.7593.76
9090.9095.8193.9096.11
9191.6993.5293.8193.79
9292.7193.6693.7593.71
9393.7193.6494.3093.82
9494.7699.93102.50100.02
9595.72109.55110.47109.53
96114.63109.25111.25109.69
9797.64109.59109.38109.38
9898.78109.81109.69109.37
9999.58109.48109.37109.39
100100.67109.30109.38109.43
110110.56124.69125.00125.01
120120.28125.03125.14125.01
130130.84140.70141.24140.67
140144.30140.66140.63140.66
150150.49156.18156.25156.29
160160.38171.76172.66171.90
170174.50172.81171.88171.87
180180.58187.39187.50187.50
190190.55203.04203.19203.06
200200.89203.32203.12203.12
210210.93218.76218.75218.75
220220.72234.28234.37235.16
230230.93234.23234.38234.39
240240.86249.89249.98250.03
250250.85249.91250.00249.99
260261.73266.03265.63265.60
270270.52281.20281.25281.23
280280.56281.16281.24281.24
290290.63296.86296.87296.86
300300.77312.35312.49312.50
310310.53312.43312.50312.51
320320.62328.13328.12328.12
330330.43343.64343.75343.74
340340.75343.63343.75343.81
350350.57359.36359.37359.48
360360.85374.83375.00375.01
370370.53374.93375.00375.01
380380.80390.60390.63390.64
390390.51390.56390.62390.63
400400.59406.28406.26406.25
410410.53421.81421.88421.88
420420.67421.82421.88421.94
430430.51437.39437.50437.53
440440.56453.00453.13453.12
450450.90453.01453.12453.12
460460.67468.71468.74468.73
470470.56484.29484.37484.37
480480.61484.24484.37484.38
490490.58499.88500.01500.03
500500.59499.85500.00500.02
510510.64515.59515.62515.63
520520.52531.17531.26531.27
530530.78531.22531.26531.26
540540.54546.79546.88546.92
550550.83562.40562.50562.50
560560.48562.49562.50562.53
570570.57578.00578.12578.13
580580.58593.63593.75593.76
590590.58593.63593.75593.75
600600.51609.34609.37609.43
610610.67624.90625.00625.00
620620.53624.94624.99625.04
630630.61640.59640.63640.66
640640.91640.61640.63640.63
650650.99656.19656.25656.29
660660.58671.88671.88671.87
670670.65671.85671.88671.89
680680.55687.40687.50687.53
690690.72703.00703.13703.12
700700.59703.00703.13703.13
710710.66718.71718.75718.75
720720.68734.30734.38734.36
730730.59734.25734.37734.44
740740.51749.90750.00750.04
750750.71749.88749.89750.01
760767.71767.43765.60765.71
770772.40782.20785.29783.42
780782.34781.16781.20781.26
790791.15796.82798.25796.92
800802.97814.65814.25812.50
810821.12860.42814.70813.61
820822.23828.34828.12828.17
830832.87843.64843.90843.75
840842.62843.48843.90843.74
850851.14859.29859.38859.37
860865.43874.82874.91875.00
870870.97874.97874.98874.99
880881.05891.12890.63890.62
890891.07890.59890.61890.88
900901.54906.18906.40906.29
910911.32924.00922.41922.03
920921.20921.88923.91922.05
930930.63937.62937.51937.50
940940.81953.09953.12953.12
950950.94953.12953.13953.14
960960.62968.90968.74968.79
970970.56984.24984.38984.36
980980.67984.33984.37984.44
990990.63999.931000.001000.00
10001000.60999.861000.001000.00

win常数坐标轴

win对数坐标轴

linux

延时(ms)SleepGetTickCountGetTickCount64Timer
11.381.031.111.48
22.672.102.162.15
33.573.233.183.36
44.494.024.324.13
55.545.275.525.38
66.736.126.206.33
77.577.417.277.28
88.528.168.118.21
99.529.179.169.51
1010.4610.4010.2810.65
1111.5211.1711.2911.48
1212.7012.0612.1312.65
1313.5013.6113.2713.29
1414.8314.3214.0816.12
1515.5015.0715.5415.45
1616.5116.0916.0816.10
1717.6017.1517.0617.31
1818.4718.1518.1018.88
1919.4619.2319.1519.49
2020.4720.2020.0720.47
2121.5021.2121.4721.45
2222.4222.0822.0822.32
2323.5923.1323.3023.36
2424.4324.1924.1024.25
2525.4625.1125.1325.35
2626.5026.2326.1026.33
2727.4327.0827.0927.32
2828.3928.3228.0528.26
2929.5729.1529.2029.14
3030.5530.2730.2130.37
3131.4131.3731.4231.45
3232.4232.1132.0832.25
3333.4833.0733.1633.20
3434.4034.1034.1034.41
3535.5435.0935.0335.35
3636.4036.0136.0736.29
3737.4637.1637.1937.29
3838.5938.1238.2338.30
3939.4739.1939.1939.48
4040.4040.0440.0540.32
4141.4941.2741.2041.45
4242.5242.1442.1642.41
4343.5443.0343.0443.14
4444.4844.1044.0344.22
4545.6045.1045.1145.20
4646.5046.1646.1846.53
4747.5747.1647.1847.25
4848.5348.0948.2248.36
4949.6049.2449.4449.18
5050.4450.1050.0950.24
5151.5051.5551.1151.69
5252.5452.1752.3652.45
5353.4553.3653.4353.64
5454.4754.1454.3154.30
5555.6055.1355.2455.22
5656.5656.0356.1956.17
5757.5457.0857.5357.36
5858.5858.1858.0858.63
5959.5459.0559.1459.04
6060.4960.0360.0760.54
6161.6261.7461.4761.46
6262.5362.2562.9362.91
6363.5664.0063.4063.72
6464.4464.2564.5865.36
6565.5665.2565.1165.15
6666.5066.1466.1266.24
6767.4367.6567.1567.32
6868.3868.0568.3668.59
6970.1670.3970.1369.78
7070.5870.7870.5670.78
7171.4571.5871.2472.08
7272.4872.1672.0372.81
7373.4373.1273.1873.28
7474.4974.1374.3774.47
7575.3575.0975.1275.13
7676.4476.4076.1076.32
7777.5077.4677.1277.57
7878.4078.2778.1278.31
7979.4779.1379.1179.45
8080.4180.1380.1280.37
8181.4481.1481.2381.34
8282.5582.1982.2584.44
8383.7183.3483.1983.45
8484.5084.1184.4284.85
8585.7485.5885.4485.70
8686.5886.0386.1486.15
8787.6987.1887.1287.23
8888.4688.0497.4788.22
8989.5590.0089.6489.70
9091.4291.0190.7190.37
9191.6491.1692.1491.42
9292.4992.1592.0792.17
9393.4993.2393.5793.47
9494.5294.1994.3894.47
9595.5795.3095.2895.31
9696.5596.1196.0696.48
9797.5297.0997.7397.46
9898.7198.0798.3598.55
9999.6099.1399.1899.71
100100.83100.16100.30100.78
110110.49110.31110.42110.22
120120.47120.19121.13121.35
130130.70130.48130.26130.21
140140.69140.56140.07140.85
150150.48150.27150.28150.23
160160.52160.07160.07160.41
170170.43170.20170.58170.41
180180.52180.05180.24180.87
190190.41190.21190.12190.25
200200.40200.09200.27200.30
210210.55210.60210.46210.43
220220.54220.09220.05220.27
230230.47230.14230.20230.71
240240.68240.22240.08240.21
250250.51250.56250.06250.30
260260.45260.22260.10260.30
270270.43270.06270.14270.32
280280.41280.12280.09280.22
290290.48290.48290.40290.23
300300.53300.10300.24300.22
310310.50310.24310.14310.45
320320.44320.12320.15320.19
330330.46330.10330.18330.27
340340.41340.11340.05340.40
350350.48350.19350.14350.44
360360.45360.13360.12360.20
370370.50370.20370.13370.22
380380.43380.07380.05380.27
390390.44390.05390.08390.26
400400.42400.15400.03400.20
410410.46410.12410.10410.28
420420.45420.00420.12420.28
430430.48430.10430.08430.21
440440.45440.02440.09440.11
450450.51450.22450.11450.39
460460.48460.10460.14460.29
470470.55470.28470.08470.62
480480.50480.24480.37480.61
490490.56490.06490.08490.17
500500.54500.13500.03500.40
510510.56510.13510.18510.35
520520.43520.09520.09520.23
530530.51530.18530.19530.26
540540.51540.10540.16540.40
550550.52550.13550.20550.30
560560.45560.08560.15560.20
570570.44570.12570.33570.30
580580.38580.19580.05580.18
590590.41590.08590.05590.27
600600.41600.08600.07600.26
610610.49610.33610.20610.27
620620.50619.99620.14620.36
630630.45630.11630.08630.32
640640.41640.18640.08640.13
650650.51650.19650.19650.23
660660.39660.04660.04660.16
670670.49670.37670.18670.25
680680.39680.13680.21680.24
690690.45690.30690.10690.26
700700.41700.23700.08700.19
710710.44710.09710.21710.28
720720.45720.06720.04720.16
730730.45730.07730.13730.23
740740.44740.19740.11740.08
750750.42750.12750.26750.41
760760.46760.06760.15760.28
770770.74770.45770.42770.58
780780.90780.30780.33780.63
790792.37790.56790.35790.54
800800.57800.29800.37800.33
810810.71810.34810.49812.78
820820.70820.41821.46823.84
830830.63830.22830.50830.55
840840.55840.19840.26840.52
850850.67850.37850.27850.47
860860.48860.25860.58860.41
870870.52870.73870.84870.86
880880.51880.22880.15880.55
890890.59890.27890.30890.53
900902.35900.28900.28900.38
910910.54910.27910.51910.55
920920.56920.58920.28920.57
930930.70930.29930.33930.61
940941.74940.11940.20940.76
950950.74950.09950.19950.26
960960.44960.09960.17960.39
970970.46970.09970.12970.39
980980.44980.11980.14980.29
990990.52990.06990.44990.33
10001000.461000.031000.231000.13

linux常数坐标轴

linux对数坐标轴

结论

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

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

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