카테고리 없음

esp32 / arduino uno 성능 비교, 소수 구하기

미친토끼 2025. 5. 16. 06:00

arduino uno가 속도가 느리고 와이파이/블루투스 기능이 없어서 요즘 esp32에 부쩍 관심이 가고 있다. 소수 구하는 테스트를 해보니 10배 이상 차이가 난다.

#include <math.h>


int isPrime(uint32_t num) {
  uint32_t i, root_num;
  
  root_num = (uint32_t)sqrt(num) + 1;
  //if (num <= 1) return 0;  // 1 이하라면 소수 아님
  if (num % 2 == 0) return 0; // 2의 배수라면 소수 아님

  for (i = 3; i < root_num; i+=2)
    if (num % i == 0)
      return 0;
    //printf("i = %lu", i);
  return 1;
}

void getPrimes3(uint32_t start_num, uint32_t end_num) {
  if (start_num == 2) {
    Serial.println(start_num);
    start_num += 1;
  }
  if (start_num % 2 == 0)  // 짝수라면 +1을 해서 홀수로 시작
    start_num += 1;
    
    // 속도를 위해 홀수로만 검사함. 2 외에는 짝수에 소수 없음.
  for (uint32_t i = start_num; i <= end_num; i+=2) {
    if(isPrime(i))   //소수면 출력한다.
       Serial.println(i);
  }
}

void setup() {
  Serial.begin(115200);
  int32_t started = millis();
  getPrimes3(3, 200000);
  int32_t ended = millis();
  Serial.print("Taken time: ");
  Serial.println((ended - started)/1000.0);
}



void loop() {
  // put your main code here, to run repeatedly:

}

 

ESP32 dev board

...

199909
199921
199931
199933
199961
199967
199999
Taken time: 11.45

 

아두이노 우노

...

199921
199931
199933
199961
199967
199999
Taken time: 147.20

 

esp32가 아두이노 우노보다 소수 구하기 능력에서 12.86배 빠르다.

같은 코드를 PC용으로 수정해서 노트북에서 돌려보았다. 인텔 펜티움 6405U, 2.4Ghz.

...

199909
199921
199931
199933
199961
199967
199999

real 0m0.065s
user 0m0.031s
sys 0m0.034s

 

#include <math.h>
#include <stdio.h>
#include <stdint.h>

int isPrime(uint32_t num) {
  uint32_t i, root_num;
  
  root_num = (uint32_t)sqrt(num) + 1;
  //if (num <= 1) return 0;  // 1 이하라면 소수 아님
  if (num % 2 == 0) return 0; // 2의 배수라면 소수 아님

  for (i = 3; i < root_num; i+=2)
    if (num % i == 0)
      return 0;
    //printf("i = %lu", i);
  return 1;
}

void getPrimes3(uint32_t start_num, uint32_t end_num) {
  if (start_num == 2) {
    printf("%u\n", start_num);
    start_num += 1;
  }
  if (start_num % 2 == 0)  // 짝수라면 +1을 해서 홀수로 시작
    start_num += 1;
    
    // 속도를 위해 홀수로만 검사함. 2 외에는 짝수에 소수 없음.
  for (uint32_t i = start_num; i <= end_num; i+=2) {
    if(isPrime(i))   //소수면 출력한다.
       printf("%u\n", i);
  }
}

void main() {
  getPrimes3(3, 200000);
}