创客常用开发板“四剑客”对比,谁最“快”?
小編提到過(guò)隨著嵌入式平臺(tái)和框架之間的相互學(xué)習(xí)和融合,Arduino愛好者的工具箱里的工具也越來(lái)越多了,比如時(shí)下最流行的支持Arduino IDE開發(fā)的“四劍客”:
Arduino UNO R3
UNO作為Arduino官方的標(biāo)準(zhǔn)開發(fā)板,血統(tǒng)當(dāng)然最純正,各種資源也最豐富。奈何這位“正宮太子”資質(zhì)確實(shí)平平,一顆ATMega328P 8位AVR的心,這幾年讓人覺得有點(diǎn)“力不從心”了。
STM32F103C8T6 BluePill核心板
我們提到過(guò)這塊外號(hào)叫“BluePill(藍(lán)色藥丸)”的STM32F103C8T6核心板,藍(lán)色藥丸兄可謂出身世家,STM32家族龐大,兄弟眾多,各個(gè)領(lǐng)域都有涉及。雖然作為家族小弟,這位仁兄有著32位的ARM心,72MHZ的主頻,要身材有身材要模樣有模樣,還不驕不躁,價(jià)格親民。10塊錢不香么,您還要啥自行車?
ESP8266和ESP32兩兄弟
這兩兄弟可謂是兩匹土著黑馬,完全沒(méi)有顯赫的家世,純憑自己骨骼奇異、天賦異稟,借著物聯(lián)網(wǎng)的大潮順勢(shì)而起,備受眾人喜愛。在左鄰右舍你一勺我一碗的給養(yǎng)下,什么C/C++、Lua、MicroPython、JS、mRuby、BASIC...什么功夫都會(huì)點(diǎn)。兄弟特點(diǎn)也很直白,小弟ESP8266只鉆研WiFi門,然后就是頭鐵價(jià)格低,不服就肝。大哥ESP32雙核心,左手練WiFI,右手練藍(lán)牙,弟弟會(huì)的大哥我也全會(huì),價(jià)格也很親民。
那有人可能會(huì)問(wèn),這“四劍客”里如果分個(gè)高下,誰(shuí)的性能最牛呢?
把四塊開發(fā)板的參數(shù)列張表的話:
純從參數(shù)上判斷的話,很多硬件參數(shù)是高下立判的,比如說(shuō)如果我們要比較四塊開發(fā)板的處理能力最快,那從主頻上看,應(yīng)該是ESP32最猛,畢竟是雙核,ESP8266應(yīng)該比STM32F103稍快,最后才是8位的UNO R3。
理論上應(yīng)該是這樣的,但實(shí)際上是這樣的么?如果是,那到底快多少呢?今天我們就來(lái)實(shí)踐一下。
判斷快的方法其實(shí)很簡(jiǎn)單:大家在同一時(shí)間間隔里處理同樣的工作,誰(shuí)的干的活越多誰(shuí)就越快,或者大家干等量的工作,誰(shuí)用的時(shí)間最少誰(shuí)就越快。接下去我們就設(shè)計(jì)幾種工作進(jìn)行比較。
素?cái)?shù)運(yùn)算
素?cái)?shù)又稱質(zhì)數(shù),指在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù)的自然數(shù)。不廢話,上代碼:
//素?cái)?shù)運(yùn)算實(shí)驗(yàn)long start = 0;long max_seconds = 30;long i = 2; // Start at 2long found = 0; // Number of primes we've foundlong lastPrime = 0; void setup() { Serial.begin(57600);while (!Serial) { }Serial.println("Prime calculation starting.");start = millis();} void loop() { int prime = is_prime(i); // Check if the number we're on is primeif (prime == 1) { //Serial.print(i); //Serial.println(" is prime "); lastPrime = i; found++; }int running_seconds = (millis() - start) / 1000;if (max_seconds > 0 && (running_seconds >= max_seconds)) { Serial.print("\nFound "); Serial.print(found); Serial.print(" primes in "); Serial.print(max_seconds); Serial.println(" seconds"); Serial.print("Highest prime found was: "); Serial.println(lastPrime); delay(60000);i = 2; found = 0; start = millis(); }i++;} int is_prime(long num) { // Only have to check for divisible for the sqrt(number) int upper = sqrt(num);// Check if the number is evenly divisible (start at 2 going up) for (long cnum = 2; cnum <= upper; cnum++) { long mod = num % cnum; // Remainderif (mod == 0) { return 0; } // If the remainer is 0 it's evenly divisible }return 1; // If you get this far it's prime}這段代碼的作用就是讓單片機(jī)在30秒的時(shí)間內(nèi)找盡可能多的素?cái)?shù),然后輸出找到的素?cái)?shù)數(shù)目和最大的素?cái)?shù)。這里考驗(yàn)的是單片機(jī)純整數(shù)運(yùn)算的能力。
我們讓四劍客都運(yùn)行一遍相同的程序。結(jié)果如下:
這里讓小編比較驚訝的是STM32F103竟然秒掉了ESP8266,理論被打臉?當(dāng)然ESP32大哥遙遙領(lǐng)先,默認(rèn)還只用了一個(gè)核。
浮點(diǎn)運(yùn)算
所謂的浮點(diǎn)運(yùn)算,簡(jiǎn)單地理解就是小數(shù)的加減乘除運(yùn)算。因?yàn)閱纹瑱C(jī)里處理的都是整數(shù),小數(shù)就要用類似科學(xué)計(jì)數(shù)法的方式來(lái)表示。小數(shù)計(jì)算比整數(shù)復(fù)雜多了,有些單片機(jī)比如ESP32內(nèi)置了單獨(dú)的浮點(diǎn)計(jì)算器。
測(cè)試代碼如下,即輸出10萬(wàn)次浮點(diǎn)運(yùn)算的耗時(shí):
//浮點(diǎn)運(yùn)算實(shí)驗(yàn)#pragma GCC optimize ("-O0") //disable the optimizerfloat tt, aa = 12345.8;long loops = 100000; void setup() { Serial.begin(115200); while (!Serial) { } Serial.println("Floating point calculation starting.");} void loop() { long start = millis(); for (long i = 0; i < loops; i++) { tt = 5000.0 * aa / i; } Serial.println(millis() - start); //milliseconds毫秒 Serial.println("====="); delay(2000);}測(cè)試結(jié)果如下:
I/O速度測(cè)試
最后,我們要來(lái)進(jìn)行比較的是輸入和輸出的速度比較。比如pinMode,digitalWrite還有digitalRead這幾個(gè)函數(shù)的運(yùn)行速度。
//I/O速度測(cè)試實(shí)驗(yàn)#pragma GCC optimize ("-O0") //disable the optimizerint tt = 0;long loops = 100000; #if defined(ARDUINO_ARCH_AVR) //Arduino#define testPin 2#else#if defined(ARDUINO_ARCH_ESP8266) //ESP8266#define testPin D2#else#if defined(ARDUINO_ARCH_ESP32) //ESP32#define testPin 2#else#define testPin A0 //STM32 #endif#endif#endif void setup() { Serial.begin(115200); while (!Serial) { } Serial.println("I/O speed test starting.");} void loop() { long start = millis(); for (long i = 0; i < loops; i++) { pinMode(testPin, OUTPUT); digitalWrite(testPin, LOW); digitalWrite(testPin, HIGH); pinMode(testPin, INPUT); digitalRead(testPin); if (digitalRead(testPin)) { tt = 150 * 1234; } else { tt = 554 % 12; } } Serial.println(millis() - start); //milliseconds毫秒 Serial.println("====="); delay(2000);}測(cè)試結(jié)果如下:
總結(jié)
首先我們得承認(rèn)三組實(shí)驗(yàn)還可以做的更加嚴(yán)謹(jǐn),比如像開發(fā)板的不同設(shè)計(jì)、編譯器設(shè)置、SDK的類型和版本等都會(huì)影響速度;還有對(duì)比結(jié)果可以更詳細(xì),比如整數(shù)運(yùn)算和浮點(diǎn)運(yùn)算都可以分加減乘除、digitalRead和digitalWrite、analogRead和analogWrite都應(yīng)該分開測(cè)速...等等。
但通過(guò)上面的三組實(shí)驗(yàn)粗略比較,相信大家已經(jīng)對(duì)“四劍客”的“誰(shuí)最快”、“快多少”有了大致的了解。但“快”并不是我們選擇的唯一標(biāo)準(zhǔn),最快的并不是最好的,適合你項(xiàng)目的才是最好的。
比如你的項(xiàng)目需要WiFi不需要藍(lán)牙,而且對(duì)于性能并沒(méi)有太高的要求,那就選NodeMCU/ESP8266;比如你的項(xiàng)目不需要無(wú)線連接,需要比較好的性價(jià)比,那就選STM32F103C8T6核心板,如果不會(huì)設(shè)置各種庫(kù)和環(huán)境、簡(jiǎn)單能上手就行,那就乖乖選Arduin UNO R3吧。
如果你不想選擇,“四劍客”全都要,那歡迎光臨我們的小店,四種開發(fā)板全有售。
總結(jié)
以上是生活随笔為你收集整理的创客常用开发板“四剑客”对比,谁最“快”?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【arduino】童芯派彩屏显示图片,图
- 下一篇: 【需求】手机无线投屏到电视需求整理,Mi