Contains applications that measure the performance of Meadow, as well as the results of those tests.
This is primarily to track the progress of our performance improvements.
To validate, make sure to run application in release mode.
Please Note - Small variances will occur between runs and between boards.
Below this markdown you will see the kinds of tests we perform on our boards to benchmark its performance for each release.
Calculates pi (3.14159..) to [x] digits and records the amount of time (in seconds) it takes. Here are the results per release:
| Operation | b3.5 | b3.6 | b3.7 | b6.0.1 | b6.3 | RC1 | RC1 w/ JIT | RC-2 | RC-3 | 3.0-preview |
|---|---|---|---|---|---|---|---|---|---|---|
| Calculate 50 digits | 11s |
11s |
2.3s |
1.8s |
1.7s |
2.3s |
2.3s |
2.2s |
2.5s |
2.1s |
| Calculate 100 digits | 54s |
54s |
10.8s |
8.9s |
8.3s |
11.2s |
11.1s |
10.1s |
11.9s |
9.9s |
| Calculate 150 digits | 127s |
126s |
24.4s |
20.6s |
19.3s |
26.3s |
25.8s |
23.4s |
27.9s |
23.0s |
Create a 1,000 item List<int>, and perform basic list operations on it.
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1+JIT | RC-2 | RC-3 | 3.0-preview |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Instantiation | 30ms |
30ms |
30ms |
19ms |
10ms |
11ms |
11ms |
5ms |
13ms |
14ms |
15ms |
14ms |
| Population | 120ms |
120ms |
20ms |
44ms |
20ms |
21ms |
10ms |
21ms |
28ms |
29ms |
31ms |
30ms |
| Summation | 130ms |
120ms |
30ms |
21ms |
19ms |
19ms |
11ms |
19ms |
26ms |
26ms |
29ms |
22ms |
Clear the 1,000 item list by removing an item one at a time:
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1+JIT | RC-2 | RC-3 | 3.0-preview |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Clearing | 59000ms |
59000ms |
7700ms |
6100ms |
7100ms |
9000ms |
8800ms |
7500ms |
115ms |
130ms |
134ms |
114ms |
Initializes three DigitalOutputPort instances, one for each of the onboard LED components and writes to them.
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1+JIT | RC-2 | RC-3 | 3.0-preview |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Port initialization | 2700ms |
2800ms |
2000ms |
500ms |
450ms |
460ms |
470ms |
480ms |
740ms |
704ms |
770ms |
1413ms |
Alternate states to 3 Digital Output ports in 100 cycles.
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1 w/ JIT | RC-2 | RC-3 | 3.0-preview | 3.0-preview (raw BSRR) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 300 writes | 48000ms 13000ms |
150ms |
1400ms |
1330ms |
150ms |
140ms |
140ms |
50ms |
50ms |
54ms |
5ms |
1ms |
NOTE: Due to the drastic change of performance for this benchmark going from 4800 milliseconds (or 4.8 seconds) to 50 milliseconds (or 0.05 seconds), the graph below is expressed on a logarithmic scale.
Average time calculated between creating and writing on the digital output ports.
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1 w/ JIT | RC-2 | RC-3 | 3.0-preview | 3.0-preview (raw BSRR) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Avg time per write | 159ms |
42ms |
0.5ms |
0.5ms |
0.44ms |
0.51ms |
0.46ms |
0.47ms |
0.16ms |
0.17ms |
0.18ms |
0.017ms |
0.003ms |
NOTE: Due to the drastic change of performance for this benchmark going from 159 milliseconds to 0.17 milliseconds, the graph below is expressed on a logarithmic scale.
Generates a PWM signal in software. Currently is a visual test. Run the test and note which was the last frequency change that was noticeable.
| Operation | b3.5 | b3.6 | b3.7 | b4.3 | b5.1 | b6.0.1 | b6.3 | RC1 | RC1+JIT | 3.0-preview |
|---|---|---|---|---|---|---|---|---|---|---|
Maximum Frequency @ 50% duty |
~50hz |
~50hz |
~100hz |
~100hz |
~100hz |
~100hz |
~100hz |
~100Hz |
~1500Hz |
TBD |
3.0-preview: .NET 10 Mono runtime (Meadow.OS 2.999.2.2) on F7CoreComputeV2 in a ProjectLab V5, Release build of both the native runtime and the managed app. The benchmark project was bumped from Meadow.Sdk/1.1.0 / netstandard2.1 / App<F7FeatherV1> to Microsoft.NET.Sdk / net10.0 / App<F7CoreComputeV2>, and the three OnboardLedRed/Green/Blue pin references in the Digital Output and Soft PWM tests were retargeted to free F7CC pins (PA0, PA3, PA9); the test logic is otherwise unchanged. Soft PWM max frequency requires visual / scope inspection — _TBD_ until measured. The dedicated GPIO microbenchmark in the Meadow repo (F7DigitalOutputPort fast path) reports ~0.26µs per State = write in a tight 200k-iteration loop; this benchmark's 0.017ms (≈17µs) per write reflects the same path under the README's short 300-iteration / 3-distinct-port test pattern, which has less JIT warm-up and fewer inlining opportunities.
3.0-preview (raw BSRR): Same 100×3 alternation as the standard "300 writes" measurement, but written through F7DigitalOutputPort.GetRawWriteHandle(out uint* bsrr, out uint setMask, out uint clearMask) — a new escape hatch in Meadow.Core that hands back a pointer to the STM32 BSRR register and the set/clear masks for the pin. The hot loop becomes three back-to-back register stores per iteration with no virtual dispatch and no _state field maintenance. Stopwatch's ~1ms resolution caps measurement at the low end; the 200k-iteration GPIO microbenchmark in the Meadow repo resolves the raw path at closer to 45ns/write (≈22 MHz square wave when unrolled). The relative ~5× advantage over the managed State = path on the same hardware with the same loop shape is the headline; the absolute number is bounded by timer granularity.














