Đánh giá hiệu năng giữa Python và C trên Raspberry Pi

Python được biết đến như là ngôn ngữ chính để lập trình IO cho RPi nhưng bạn cũng hoàn toàn có thể sử dụng các ngôn ngữ khác để thực hiện điều này. Tuy sẽ khó khăn hơn so với việc sử dụng Python nhưng cũng sẽ có những ưu điểm khác bù lại. Sau đây, ta sẽ đánh giá khả năng IO của RPi khi chạy chương trình bằng ngôn ngữ Python và C.

Bài test được thực hiện trên hệ điều hành chung là Ubuntu Mate và sẽ có một chút xíu khác biệt đối với các hệ điều hành khác nhau.

Test Python

Để điều khiển RPi với Python, ta sử dụng thư viện RPI.GPIO. Dưới đây là một đoạn chương trình mẫu xuất xung ngõ ra trong một vòng lặp vô tận.

test.py

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
 
while True:
 GPIO.output(18, True)
 GPIO.output(18,False)
 
GPIO.cleanup()
 

Chạy chương trình bằng lệnh 

 sudo python test.py

Đây là kết quả, chương trình Python chiếm CPU khá lớn.

Untitled1

Bằng thiết bị đo giao động tần số 100Mhz của Saleae Logic, đo dạng sóng ngõ ra của chân RPI ta được.

Untitled2

và tốc độ phát xung tối đa của Python có thể đạt được trên RPI là 194.6 Khz . Độ rộng xung 2.64uS cho thấy một lệnh của Python từ lúc thực thi tới lúc xuất tín hiệu ra IO chiếm 2.64uS.

Test C

Đối với ngôn ngữ C ta cần cài đặt thư viện WiringPi và trình biên dịch GCC (GCC đã được tích hợp sẵn bên trong Ubuntu Mate).

Dưới đây là một đoạn chương trình tương tự như chương trình Python ở trên nhưng được viết bằng ngôn ngữ C. Có thể thấy sự khác biệt ở đây chính là thứ tự chân của RPI bởi vì mỗi thư viện quy định số chân với vị trí khác nhau. Trên thực tế 2 chương trình này điều khiển chỉ duy nhất một chân.

test.c

#include <wiringPi.h>
 
int main(void)
{
  wiringPiSetup() ;
  pinMode(1, OUTPUT) ;
 
  for(;;)
  {
    digitalWrite (1, HIGH) ; 
    digitalWrite (1,  LOW) ; 
  }
 
  return 0 ;
}

Sau đó biên dịch bằng lệnh.

gcc -Wall -o testc testc.c -lwiringPi

Ta sẽ có một file thực thi là testc, thực thi bằng lệnh  ./testc

Untitled3

Ta thấy một điểm giống nhau của 2 chương trình là sử dụng tối đa 100% CPU của RPi. Tuy nhiên kết quả thu được từ ngõ ra mới là điều đáng chú ý.

Untitled4

Tốc độ điều khiển IO của C cho phép phát xung tới tần số 10Mhz, tức là mỗi lệnh từ việc điều khiển tới liên kết thư viện và xuất ra ngõ IO chỉ chiểm 50nS. Nhanh hơn với việc sử dụng Python khoảng 50 lần và khả năng tính toán cũng cho ra tốc độ cao hơn so với Python. Tuy nhiên nhược điểm là một khi đã biên dịch thành file thực thi thì sẽ không thể xem lại được mã nguồn nữa.

Dưới đây là kết quả của việc chạy hai chương trình C và Python (đã chỉnh sửa chương trình C để xuất tín hiệu ra một chân khác).

Untitled5

Hai chương trình chạy 2 vòng lặp vô tận đã chiếm hầu hết hiệu năng của 2 nhân xử lý của RPI (ở các ứng dụng thực tế , không nên tồn tại các vòng lặp vô tận thế này).

Untitled6

Có thể thấy tốc độ thực thi của C bỏ xa tốc độ của Python.

Kết

Python là một ngôn ngữ cho phép việc thông dịch (interprete) ngay trong lúc chạy cho nên mỗi dòng lệnh đều được thông dịch lại. Và trên hết, Python là ngôn ngữ tối giản, đơn giản cho người dùng nên để đáp ứng được điều đó, nó phải đi kèm theo bộ thư viện cồng kềnh để có thể diễn đạt được hết ý người viết sang ngôn ngữ máy.

C thì ngược lại, tuy phức tạp hơn Python nhưng không quá khó hiểu. Toàn bộ chương trình được biên dịch (compile) thành file thực thi. Chương trình được tối ưu, thư viện và mã thừa ít hơn, từ đó mang đến hiệu năng chương trình cao hơn. C là một ngôn ngữ có độ khó vừa phải và hiệu năng cao. So với mặt bằng hiện tại thì C qua bao nhiêu năm vẫn là một ngôn ngữ “đáng đồng tiền bát gạo” nhất cho những người lâp trình phần cứng.

Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
5 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Dự án bật tắt máy bơm nước - Tự bơm nước khi hết nước - Sử dụng module relay và siêu âm

Thấy bài viết của bạn Hải Đăng PPK khá hay, cũng nói đến về dự án bật tắt đơn giản nhưng đúng nhu cầu. Mình đã làm thành công, tuy nhiên, mình dùng một cảm biến siêu âm để bơm nước cho cái thùng nước nhà mình. Cảm ơn Hải Đăng PPK nhiều nhiều nhé!

lên
19 thành viên đã đánh giá bài viết này hữu ích.

Lập trình ATtiny45 hoăc ATtiny85 với Codebender

Hôm nay có vấn đề đụng đến attiny45 mà mình lại lười tải Arduino IDE 1.0.6 để lập trình cho dễ, thành ra quyết định dùng codebender để lập trình. Mình tìm trên cộng đồng mà không có bài nào nói về vấn đề này, nhưng lại có bài của ksp khá liên quan, chỉ cần chỉnh file boards.txt rồi up lên một tí là được. Nên mình quyết định viết bài cho anh em sau này gặp thì giải quyết cho dễ

lên
2 thành viên đã đánh giá bài viết này hữu ích.