TechCompare LogoTechCompare

What a single thread CI runner benchmark can tell you

A single thread benchmark asks how quickly one execution thread completes a fixed CPU workload. It can help explain why a serial step behaves differently across runners, but it doesn't measure the total throughput of a machine. This suite uses CoreMark with a 2000-byte dataset and reports the median iterations per second across five CPU samples.

By TechCompare · Updated

Measured configurations
26
CPU execution threads
1
Five accepted samples per runner

Variation describes the accepted samples

The coefficient of variation is the population standard deviation divided by the sample mean, expressed as a percentage. The white line in each CPU bar shows the observed minimum and maximum. It isn't a confidence interval or a forecast of the next run. Five samples can expose variation in this test, but they don't capture every time of day, host allocation, or image update.

Pricing and CPU speed answer different questions

Dividing a published minute price by the billed vCPU count gives a normalized compute rate. Multiplying that count by the single thread score doesn't yield measured multicore performance. Likewise, dividing the score by the entire machine price isn't a cost per build. This snapshot has no complete application build timings or queue measurements, so it doesn't claim a best provider for every workflow.

Calculator

GitHub Actions runner CPU models, single thread CPU scores, disk, cache, and internet scores, and value per USD compute cost. Missing tests have no score.
RunnerCPUSingle threadCPU valueDiskCacheInternetCost/vCPU/minUSDMax vCPU
Avrea Linux arm64

Apple M5 Max

52,794
8.8M/USD
1,239.3
220.8
18.8
0.00616
Avrea macOS arm64

Apple M5 Max

52,014
5.2M/USD
1,022
251.6
21.2
0.0116
Namespace macOS arm64

Apple M4 Pro

46,338
3.1M/USD
948.7
39.6
79
0.01516
Blacksmith Linux x64

AMD EPYC (model hidden)

45,851
22.9M/USD
1,331.6
154.4
741.9
0.00232
Avrea Linux x64

AMD EPYC 4585PX 16-Core

43,680
21.8M/USD
864.5
103.8
921.7
0.00232
BuildPulse Linux x64

AMD EPYC 9R45

43,146
21.6M/USD
28.2
58
159.1
0.00264
Blacksmith macOS arm64

Apple M4 Pro

41,001
3.1M/USD
262.4
262.9
244.5
0.013312
Blacksmith Windows x64

AMD EPYC 4565P 16-Core

40,527
10.1M/USD
708.9
24.8
731.2
0.00432
StarSling Linux x64

AMD EPYC (model hidden)

38,218
19.1M/USD
559.1
101
116.3
0.00264
Ubicloud Linux x64

AMD Ryzen 9 7950X3D 16-Core

33,393
33.4M/USD
243.7
48.5
1,104.1
0.00130
Namespace Linux x64

AMD EPYC (model hidden)

33,130
22.1M/USD
297.3
49.6
187.3
0.001564
BuildPulse Linux arm64

AWS Graviton (gen undisclosed)

33,116
26.5M/USD
20.1
52.2
155.6
0.001364
GitHub macOS arm64

Apple M2 Pro

32,583
1.6M/USD
656.7
145.8
273.4
0.02075
GitHub Linux arm64

Microsoft Cobalt 100

31,687
12.7M/USD
73.1
82.1
102.9
0.002564
Avrea Windows x64

AMD EPYC 4585PX 16-Core

31,647
7.9M/USD
335.3
17.6
823
0.00416
GitHub Linux x64

AMD EPYC 9V74 80-Core

31,133
10.4M/USD
67
100.5
209.9
0.00396
Latchkey Linux x64

AMD EPYC 7R13

30,065
24.1M/USD
28.3
168.2
214.4
0.001316
Blacksmith Linux arm64

ARM64 (model undisclosed)

27,191
21.8M/USD
320.8
88.2
616.7
0.001332
GitHub Linux x86

AMD EPYC 7763 64-Core

25,491
8.5M/USD
81.2
96.6
116.3
0.00396
Namespace Linux arm64

AmpereOne family (SKU undisclosed)

23,534
15.7M/USD
197.8
34.7
143.6
0.001532
GitHub Windows arm64

Cobalt 100

22,553
4.5M/USD
35
13.8
120.8
0.00564
Ubicloud Linux arm64

Ampere Altra Q80-30

21,630
34.6M/USD
80.6
50.8
670.4
0.000630
GitHub Windows x64

AMD EPYC 7763 64-Core

18,327
3.7M/USD
76.7
18.9
134.2
0.00596
RunJob Linux x64

AMD EPYC 7502 32-Core

17,973
13.4M/USD
492.9
53.5
382.6
0.001348
GitHub Windows x86

AMD EPYC 7763 64-Core

15,003
3M/USD
68.6
17.5
262.4
0.00596
GitHub macOS x64

Intel Core i7-8700B

8,375
540.4K/USD
91.9
37.2
76.1
0.015512

Single thread CPU: CoreMark iterations/s. Disk and cache: composite MiB/s. Internet: composite Mbps. Value: score ÷ USD cost/vCPU/min. K means thousand, M means million. Higher is better. Cache uses each runner's best tested cache or artifact backend. Limits: maximum runner vCPU. Prices and value use USD. RunJob's EUR rate is converted at €1 = $1.1206 (ECB, 2026-10-09).

Open the full GitHub Actions runner benchmark tool

Measurement context

Linux and Windows require hard affinity to one logical CPU. macOS is deliberately unpinned, so its one thread may migrate. The compiler and optimization flags are also part of the measurement. All results appear together in the table, with compiler information and raw measurements in each row's details.

Verdict

Use the median together with the sample range, then validate any runner change against a complete workflow on your own repository. A microbenchmark is useful evidence, but it's only one part of that decision.

More runner benchmark scenarios

Frequently asked questions

Are these independent GitHub Actions runner benchmarks?
TechCompare publishes measurements from its own runner benchmark suite. The results come from the supplied published reports, while provider documentation supplies hardware mappings, prices, and available sizes. Scores from provider marketing pages aren't used as test results.
Does a CoreMark score predict my build time?
No. CoreMark is a CPU microbenchmark running one execution thread. A full build also depends on parallelism, memory, disk, dependencies, cache behavior, and queue time. This snapshot doesn't measure complete application builds or queue delays.
How are disk, cache, and internet scores calculated?
Each score is a geometric mean of that runner's own measurements. Disk combines sequential read/write MiB/s with random read/write IOPS converted to MiB/s using the 4 KiB operation size. Cache combines save and restore MiB/s from one backend. By default, each runner uses its highest verified score across tested cache and artifact backends. Hover or open details to see the backend, or select a specific backend type. Internet combines available download and upload Mbps, or uses the single recorded direction. Protocol 7 reports speeds from actual payload bytes and elapsed time, including transfers that reach the time limit. Older timeout records use recorded bytes divided by the nominal limit. These fixed formulas have no ranking reference or upper score limit, so adding a faster runner doesn't change existing scores. CPU keeps its measured CoreMark iterations per second.
How is price per minute per vCPU calculated?
A fixed runner's quoted minute rate is divided by its billed vCPU count. Prices are shown in USD and are list or overage rates before allowances and extras. RunJob publishes EUR consumed CPU rates, which are converted using the dated ECB reference rate shown on the page. Its original rate stays in the details, and memory charges are additional. GitHub uses private standard rates, and Namespace shows overage with prepaid equivalents.
What does CPU value mean?
CPU value is the measured single thread CoreMark score divided by the USD cost per vCPU per minute. More billed vCPUs don't multiply the measured score. EUR compute rates are converted before calculating value, so every provider is in one USD ranking. K means thousand and M means million. Optional disk, cache, and internet value columns use the same score divided by rate formula. These ratios don't measure full build performance or predict the final bill.
Why is an exact CPU model sometimes missing?
Some virtual machines expose only AMD EPYC or aarch64. The table uses a provider mapping where documentation identifies a family, labels that evidence, and leaves undisclosed model numbers unconfirmed. Similar benchmark scores aren't enough to identify a processor.
Are missing tests counted as zero?
No. Internet transfers with a nonzero recorded byte count can supply a speed even if they reach the time limit. A blocked request or a timeout with no recorded bytes stays unscored. Disk uses verified sample medians with all four throughput components. The updated BuildPulse ARM disk result is included using its three completed samples, with the original counts in the details. Cache requires all three verified save and restore pairs. The table shows a dash when no score is available. Hover or open the row details to inspect the measurements.