性能测试
以下所有数据都来自真实硬件,使用项目自带的基准测试套件测量。编译选项为 面向时间的最高优化等级(GCC 使用 -O3,可用时开启 LTO;Keil 与 IAR 使用 各自的最高等级)。
所有时间列均为 CPU 周期数、平均情况。每个原语在每颗芯片上的最坏情况 (WCET)公布在 Include/Test/Chip/ 的测试头文件中——在实时系统里,那才是 真正要关心的数字。
一图速览
实用移植
这些是日常嵌入式工作中使用的移植,从 8 位 AVR 一直到 Cortex-M55 与 RISC-V。... 表示沿用上一行的芯片、平台与编译工具。
| 芯片 | 平台 | 编译 | Yield | Sem | FIFO | Msgq | Bmq | Mail/I | Sem/I | Msgq/I | Bmq/I | Mem | Alrm | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ATMEGA328P | AVR | GCC | 408 | 719 | 686 | 313 | 1065 | 1318 | 624 | 626 | 905 | 1073 | N/A | TBD |
| ATMEGA1284P | ... | ... | 437 | 751 | 717 | 314 | 1098 | 1352 | 637 | 639 | 921 | 1087 | 1680 | TBD |
| ATMEGA2560 | ... | ... | 449 | 774 | 736 | 326 | 1131 | 1396 | 656 | 654 | 942 | 1117 | 1686 | TBD |
| R5F104PJ | RL78 | CCRL | 261 | 565 | 520 | 308 | 924 | 1225 | 539 | 500 | 789 | 964 | 1854 | TBD |
| PIC24FJ128 | PIC24F | XC16 | 152 | 334 | 271 | 168 | 468 | 654 | 274 | 213 | 352 | 461 | 379 | TBD |
| DSPIC33EP512 | DSPIC33E | ... | 214 | 447 | 353 | 219 | 608 | 851 | 368 | 278 | 455 | 602 | 448 | TBD |
| MSP430F149 | MSP430 | CCS | 312 | 641 | 573 | 312 | 985 | 1278 | 528 | 487 | 739 | 898 | N/A | TBD |
| MSP430FR5994 | MSP430X | ... | 468 | 1054 | 891 | 492 | 1573 | 2072 | 891 | 784 | 1176 | 1464 | 3291 | TBD |
| STM32F030F4 | Cortex-M0 | Keil | 362 | 763 | 666 | 379 | 1196 | 1609 | 689 | 616 | 950 | 1211 | N/A | TBD |
| ... | ... | GCC | 366 | 802 | 690 | 396 | 1246 | 1685 | 705 | 622 | 954 | 1200 | N/A | TBD |
| HC32L136K8 | Cortex-M0+ | Keil | 211 | 422 | 370 | 219 | 646 | 873 | 403 | 350 | 532 | 673 | 542 | TBD |
| STM32L071CB | Cortex-M0+ | Keil | 335 | 581 | 532 | 253 | 892 | 1167 | 554 | 524 | 756 | 945 | N/A | TBD |
| ... | ... | GCC | 337 | 656 | 600 | 284 | 947 | 1260 | 578 | 602 | 794 | 1003 | N/A | TBD |
| STM32G071RB | Cortex-M0+ | Keil | 264 | 465 | 407 | 209 | 697 | 948 | 463 | 400 | 577 | 726 | N/A | 904 |
| ... | ... | GCC | 289 | 536 | 480 | 233 | 694 | 958 | 489 | 462 | 599 | 772 | N/A | 892 |
| ... | ... | IAR | 298 | 545 | 480 | 252 | 762 | 1012 | 532 | 471 | 643 | 757 | N/A | 1062 |
| STM32F103RE | Cortex-M3 | Keil | 203 | 438 | 385 | 226 | 684 | 930 | 392 | 354 | 542 | 707 | 518 | TBD |
| ... | ... | GCC | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD |
| STM32F405RG | Cortex-M4F | Keil | 180 | 345 | 321 | 180 | 667 | 886 | 309 | 302 | 498 | 626 | 455 | TBD |
| ... | ... | GCC | 196 | 388 | 345 | 192 | 677 | 953 | 381 | 349 | 566 | 743 | 411 | TBD |
| STM32F429ZI | Cortex-M4F | Keil | 168 | 309 | 285 | 176 | 608 | 800 | 349 | 277 | 429 | 586 | 393 | 666 |
| ... | ... | GCC | 172 | 352 | 293 | 176 | 478 | 769 | 357 | 313 | 474 | 631 | 384 | 620 |
| ... | ... | IAR | 160 | 345 | 292 | 188 | 574 | 776 | 354 | 277 | 502 | 610 | 416 | 775 |
| STM32F767IG | Cortex-M7F | Keil | 176 | 329 | 277 | 174 | 510 | 694 | 328 | 259 | 413 | 516 | 334 | TBD |
| ... | ... | GCC | 182 | 335 | 288 | 156 | 473 | 643 | 313 | 264 | 375 | 514 | 332 | TBD |
| STM32H743ZI | Cortex-M7F | Keil | 144 | 288 | 220 | 149 | 421 | 626 | 252 | 216 | 327 | 444 | 295 | 549 |
| ... | ... | GCC | 164 | 308 | 254 | 152 | 429 | 585 | 300 | 242 | 344 | 456 | 295 | 479 |
| ... | ... | IAR | 176 | 308 | 264 | 148 | 524 | 718 | 284 | 274 | 396 | 521 | 297 | 535 |
| M2351KIAAE | Cortex-M23 | Keil | 213 | 390 | 349 | 197 | 675 | 957 | 441 | 339 | 535 | 655 | 498 | 777 |
| ... | ... | GCC | 265 | 554 | 538 | 210 | 706 | 1008 | 492 | 444 | 565 | 751 | 674 | 763 |
| ... | ... | IAR | 228 | 512 | 387 | 211 | 642 | 887 | 444 | 366 | 522 | 663 | 501 | 900 |
| STM32N657X0 | Cortex-M55 | GCC | 163 | 298 | 252 | 135 | 391 | 524 | 289 | 256 | 336 | 427 | 307 | 527 |
| ... | ... | Keil | 155 | 281 | 228 | 130 | 421 | 571 | 282 | 246 | 364 | 454 | 309 | 555 |
| ... | ... | IAR | 162 | 303 | 262 | 154 | 456 | 607 | 290 | 260 | 375 | 449 | 330 | 631 |
| TMS570LS0432 | Cortex-R4 | CCS | 306 | 493 | 460 | 193 | 686 | 897 | 480 | 464 | 592 | 736 | 533 | TBD |
| TMS570LC4357 | Cortex-R5 | ... | 275 | 479 | 467 | 216 | 746 | 998 | 440 | 435 | 595 | 763 | 482 | TBD |
| TMS320F2812 | C28x | CCS | 217 | 493 | 407 | 229 | 706 | 954 | 436 | 381 | 583 | 727 | 939 | TBD |
| TMS320F28335 | C28x/FPU32 | ... | 246 | 513 | 440 | 235 | 751 | 1001 | 440 | 413 | 622 | 770 | 946 | TBD |
| CH32V307VC | RV32IMAC | GCC | 209 | 386 | 336 | 172 | 538 | 698 | 350 | 306 | 436 | 555 | 433 | TBD |
| ... | RV32IMAFC | ... | 217 | 398 | 341 | 172 | 557 | 705 | 358 | 307 | 444 | 556 | 433 | TBD |
| Xeon 6326 | X86-LINUX | GCC | 24k | 24k | 24k | 46 | 24k | 24k | 31k | 30k | 34k | 53k | 159 | TBD |
最小的移植
能跑完整个基准测试的最小概念验证平台是 ATmega328P——32 KB Flash、2 KB SRAM。 在 STM32F030F4 上,绝对最小内核为 1.6 KB ROM 与 432 字节 RAM,其中已包含 第一个线程的控制块与栈,以及 64 字节的中断栈;内核与精简 HAL 合计仅 52 字节。
纪念性移植
这些移植面向塑造了计算历史的机器——既是为了挑战,也因为它证明了抽象并不 依附于现代指令集。
| 芯片 | 平台 | 编译 | Yield | Sem | FIFO | Msgq | Bmq | Mail/I | Sem/I | Msgq/I | Bmq/I | Mem | Alrm | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| RP2A03/FC-84 | MOS6502 | CC65 | 4073 | 5435 | 5435 | 2028 | 7726 | 10445 | 4831 | 5180 | 7220 | 8350 | 7484 | TBD |
| .../MESEN | ... | ... | 4060 | 5439 | 5424 | 2040 | 7728 | 10443 | 4836 | 5185 | 7227 | 8355 | 7446 | TBD |
| SPCE061A | unSP | GCC | 694 | 1732 | 1548 | 927 | 2671 | 3709 | 1619 | 1475 | 2242 | 2889 | 3518 | TBD |
| PIC32MZ2048 | MIPS | XC32 | 190 | 345 | 305 | 150 | 475 | 620 | 295 | 260 | 370 | 465 | 365 | TBD |
| ... | MIPS-FR64 | ... | 475 | 630 | 585 | 160 | 775 | 935 | 400 | 360 | 490 | 585 | 371 | TBD |
| Z84C0004/TP-801 | Z80 | Z88DK | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD | TBD |
RVM 虚拟化移植
同一个内核作为非特权虚拟机运行在 RVM 之上。V 是普通操作 的虚拟化开销,V/I 是中断操作的虚拟化开销。
| 芯片 | 平台 | 编译 | Yield | Sem | FIFO | Msgq | Bmq | V | Mail/I | Sem/I | Msgq/I | Bmq/I | V/I | Mem | Alrm | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STM32L071CB | Cortex-M0+ | Keil | 382 | 701 | 609 | 302 | 1007 | 1347 | 14% | 1370 | 1292 | 1545 | 1741 | 147% | N/A | 1216 |
| ... | ... | GCC | 400 | 751 | 649 | 321 | 1064 | 1420 | 19% | 1424 | 1341 | 1603 | 1796 | 210% | N/A | 1291 |
| STM32F405RG | Cortex-M4F | Keil | 252 | 436 | 372 | 200 | 708 | 924 | 40% | 1180 | 1088 | 1288 | 1452 | 281% | 385 | 798 |
| ... | ... | GCC | 312 | 540 | 448 | 204 | 656 | 1008 | 59% | 1336 | 1252 | 1404 | 1572 | 250% | 380 | 739 |
| STM32F767IG | Cortex-M7F | Keil | 184 | 293 | 275 | 144 | 504 | 705 | 6% | 772 | 742 | 899 | 983 | 135% | 275 | 578 |
| ... | ... | GCC | 192 | 352 | 292 | 148 | 466 | 650 | 6% | 903 | 853 | 1001 | 1119 | 239% | 270 | 508 |
| CH32V307VC | RV32IMAC | GCC | 233 | 384 | 336 | 148 | 489 | 629 | 17% | 1287 | 1239 | 1340 | 1421 | 267% | 390 | 605 |
| ... | RV32IMAFC | ... | 325 | 497 | 436 | 169 | 616 | 767 | 50% | 1789 | 1742 | 1857 | 1951 | 399% | 390 | 608 |
即便取表中最差的一行,虚拟化后的上下文切换仍比同级别 Cortex-M7 上的 RT-Linux 快约 25 倍——而且这个开销是有界的,不只是平均意义上较小。
指标定义
| 指标 | 含义 |
|---|---|
| Yield | 从一个线程切换到另一个线程 |
| 两个线程之间的邮箱通信 | |
| Sem | 两个线程之间的信号量通信 |
| FIFO | 单线程内的 FIFO 读写配对 |
| Msgq | 两个线程之间的消息队列(仅接收方可以阻塞) |
| Bmq | 阻塞消息队列(双方都可以阻塞) |
| Mail/I | 从中断向邮箱发送 |
| Sem/I | 从中断投递信号量 |
| Msgq/I | 从中断向消息队列发送 |
| Bmq/I | 从中断向阻塞消息队列发送 |
| Mem | 一次内存池 malloc/free 配对 |
| Alrm | 五个周期闹钟(1/2/3/5/7 个 tick)的平均处理时间 |
如何读这些数字
- 这些是平均情况数值,只是为了便于比较。每颗芯片的 WCET 位于
Include/Test/Chip/,设计时应以它为准。 TBD表示移植已经存在且可以构建,但尚未在硬件上测量;N/A表示该操作 不适用于这个平台(例如该移植未启用内存池)。- 项目不使用任何“偷巧”的优化:没有破坏可移植性的特定工具链指令序列,没有 绕过调度器的协作式切换,也没有最坏情况无界的平均情况快路径。
- 时间单位是周期而不是微秒,因此与主频无关。乘以核心的周期时间即可换算成 实际时间。
