MicroPython 在不同的硬件上性能测试数据,为选择性能合适的硬件提供参考。
测试的开发板:
micro:bit
PYB Nano
PYBV10
ST Nucleo_F091RC
ST Nucleo_F411RE
STM32L476DISC
STM32F7DISC
ST Nucleo_H743ZI
ESP8266
ESP32 WROVER
MicroPython 版本
microbit
- 1.9.2
ESP32 Lobo
- 3.20.20
All other device
- 1.9.4-479
测试项目
- Integer addition 1000,000 times
- Float addition 1000,000 times
- Integer multiplication 1000,000 times
- Float multiplication 1000,000 times
- Integer division 1000,000 times
- Float division 1000,000 times
- 1000 digit Pi calculation
- 5000 digit Pi calculation
- 100,000 digit Pi calculation
结果
MCU | Freq | Int Add | Float Add | Int Mul | Float Mul | Int div | Float Div | Pi:1000 | Pi:5000 | Pi:100000 | |
---|---|---|---|---|---|---|---|---|---|---|---|
microbit | nRF51822 | 16M | 61.89 | 78.03 | 71.59 | 81.60 | 67.95 | 106.87 | 10.98 | – | – |
Nucleo_F411 | STM32F411 | 96M | 5.86 | 13.96 | 6.07 | 14.02 | 6.07 | 14.07 | 1.25 | 19.03 | – |
PYBV10 | STM32F405 | 168M | 3.44 | 7.93 | 3.56 | 7.97 | 3.56 | 8.13 | 0.67 | 10.8 | – |
Nucleo_L432KC | STM32LM32 | 32M | 20.86 | 46.35 | 21.49 | 46.55 | 21.95 | 46.71 | 2.60 | 49.44 | – |
STM32L476DISC | STM32L476 | 80M | 8.59 | 18.34 | 8.99 | 18.42 | 8.93 | 18.49 | 1.37 | 21.45 | – |
STM32F7DISC | STM32F746 | 192M | 1.93 | 5.16 | 2.45 | 5.08 | 2.12 | 5.39 | 0.21 | 5.42 | 4276.47 |
Nucleo_H743 | STM32H743 | 400M | 0.86 | 1.96 | 0.94 | 1.98 | 0.91 | 2.07 | 0.11 | 4.66 | 1004.32 |
ESP8266 | ESP8266 | 80M | 15.55 | 18.34 | 17.96 | 18.92 | 16.96 | 21.46 | 2.09 | 40.22 | – |
ESP32 | ESP32 | 240M | 2.61 | 4.42 | 2.79 | 4.42 | 2.72 | 4.66 | 0.57 | 8.41 | – |
ESP32 psRAM | ESP32 | 240M | 3.37 | 7.96 | 3.55 | 17.88 | 15.25 | 8.32 | 0.67 | 18.01 | 12394.50 |
K210 | K210C | 8.19 | 8.76 | 8.23 | 8.74 | 7.75 | 8.76 | 0.12 | 2.82 | 1480.96 |
更多测试结果请参考:benchmark.xlsx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | ''' File: benchmarks.py Descript: benchmark test for different microcontroller Author: Shao ziyang Data: 2018-Octo-25 Version: 1.0 ''' import time import machine import gc def pi(places = 100 ): # 3 + 3*(1/24) + 3*(1/24)*(9/80) + 3*(1/24)*(9/80)*(25/168) # The numerators 1, 9, 25, ... are given by (2x + 1) ^ 2 # The denominators 24, 80, 168 are given by (16x^2 -24x + 8) extra = 8 one = 10 * * (places + extra) t, c, n, na, d, da = 3 * one, 3 * one, 1 , 0 , 0 , 24 while t > 1 : n, na, d, da = n + na, na + 8 , d + da, da + 32 t = t * n / / d c + = t return c / / ( 10 * * extra) def pi_test(n = 5000 ): t1 = time.ticks_ms() t = pi(n) t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Pi' , n, 'digit calculation: ' , r, 's' ) return '%.2f' % r def int_add_test(n = 1000000 , a = 12345 , b = 56789 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a + b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Integer Add test' , n, 'times: ' , r, 's' ) return '%.2f' % r def float_add_test(n = 1000000 , a = 1234.5678 , b = 5678.1234 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a + b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Float Add test' , n, 'times:' , r, 's' ) return '%.2f' % r def int_mul_test(n = 1000000 , a = 12345 , b = 56789 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a * b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Integer Mul test' , n, 'times: ' , r, 's' ) return '%.2f' % r def float_mul_test(n = 1000000 , a = 1234.5678 , b = 5678.1234 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a * b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Float Mul test' , n, 'times: ' , r, 's' ) return '%.2f' % r def int_div_test(n = 1000000 , a = 123456 , b = 567 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a / / b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Integer Div test' , n, 'times: ' , r, 's' ) return '%.2f' % r def float_div_test(n = 1000000 , a = 12345.678 , b = 56.789 ): t1 = time.ticks_ms() sum = 0 for i in range (n): sum = a / b t2 = time.ticks_ms() r = time.ticks_diff(t2, t1) / 1000 print ( ' Float Div test' , n, 'times: ' , r, 's' ) return '%.2f' % r def mem(): r = gc.mem_free() print ( 'free memory:' , r) print ( 'Speed test' ) try : print ( 'System freq: {:.1f} MHz' . format (machine.freq()[ 0 ] / 1000000 )) except : print ( 'System freq: {:.1f} MHz' . format (machine.freq() / 1000000 )) print ( '\nCalcaulate integer addition' ) gc.collect() mem() d1 = int_add_test() d2 = int_add_test() d3 = int_add_test() r_int_add = min (d1, d2, d3) print ( 'Integer addition test result: ' , r_int_add, 's' ) mem() print ( '\nCalcaulate float addition' ) gc.collect() mem() d1 = float_add_test() d2 = float_add_test() d3 = float_add_test() r_float_add = min (d1, d2, d3) print ( 'Float addition test result: ' , r_float_add, 's' ) mem() print ( '\nCalcaulate integer multiplication' ) gc.collect() mem() d1 = int_mul_test() d2 = int_mul_test() d3 = int_mul_test() r_int_mul = min (d1, d2, d3) print ( 'Integer multiplication test result: ' , r_int_mul, 's' ) mem() print ( '\nCalcaulate float multiplication' ) gc.collect() mem() d1 = float_mul_test() d2 = float_mul_test() d3 = float_mul_test() r_float_mul = min (d1, d2, d3) print ( 'Float multiplication test result: ' , r_float_mul, 's' ) mem() print ( '\nCalcaulate integer division' ) gc.collect() mem() d1 = int_div_test() d2 = int_div_test() d3 = int_div_test() r_int_div = min (d1, d2, d3) print ( 'Integer division test result: ' , r_int_div, 's' ) mem() print ( '\nCalcaulate float division' ) gc.collect() mem() d1 = float_div_test() d2 = float_div_test() d3 = float_div_test() r_float_div = min (d1, d2, d3) print ( 'Float division test result: ' , r_float_div, 's' ) mem() print ( '\nCalcaulate Pi 1000 digit' ) gc.collect() mem() try : d1 = pi_test( 1000 ) d2 = pi_test( 1000 ) d3 = pi_test( 1000 ) r_pi_1000 = min (d1, d2, d3) print ( '1000 digit Pi calculation result: ' , r_pi_1000, 's' ) mem() except : r_pi_1000 = None print ( ' calculation error' ) print ( '\nCalcaulate Pi 5000 digit' ) gc.collect() mem() try : d1 = pi_test( 5000 ) d2 = pi_test( 5000 ) d3 = pi_test( 5000 ) r_pi_5000 = min (d1, d2, d3) print ( '5000 digit Pi calculation result: ' , r_pi_5000, 's' ) mem() except : r_pi_5000 = None print ( ' calculation error' ) print ( '\nCalcaulate Pi 100,000 digit' ) gc.collect() mem() try : d1 = pi_test( 100000 ) d2 = pi_test( 100000 ) d3 = pi_test( 100000 ) r_pi_100000 = min (d1, d2, d3) print ( '100000 digit Pi calculation result: ' , r_pi_100000, 's' ) mem() except : r_pi_100000 = None print ( ' calculation error' ) print ( 'Test result:' ) print ( ' Integer addition test result: ' , r_int_add, 's' ) print ( ' Float addition test result: ' , r_float_add, 's' ) print ( ' Integer multiplication test result: ' , r_int_mul, 's' ) print ( ' Float multiplication test result: ' , r_float_mul, 's' ) print ( ' Integer division test result: ' , r_int_div, 's' ) print ( ' Float division test result: ' , r_float_div, 's' ) if r_pi_1000: print ( ' 1000 digit Pi calculation result: ' , r_pi_1000, 's' ) if r_pi_5000: print ( ' 5000 digit Pi calculation result: ' , r_pi_5000, 's' ) if r_pi_100000: print ( ' 100000 digit Pi calculation result: ' , r_pi_100000, 's' ) |
这份数据来自 Shao ziyang 老师的分享。
https://github.com/shaoziyang/micropython_benchmarks
发表评论