Đá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ả

Một cách tiếp cận khác với sóng vô tuyến 315 hay 433Mhz

Yeah, cộng đồng Arduino Việt Nam chúng ta đã có một bài viết về sóng vô tuyến rất hay của NTP_PRO phải không nào! Tuy nhiên, mình thấy một số ý kiến về sự đụng độ thư viện VirtualWire và Servo (của Arduino). Vì vậy, qua cách tiếp cận này của mình sẽ giúp các bạn giải quyết vấn đề trên nhé. Ngoài ra, qua bài viết, mình muốn chia sẻ cho các bạn cách "hack" những thiết bị vô tuyến hiện có như xe điều khiển từ xa. Từ đó, tự các bạn chế ra những bộ remote của riêng mình. heart

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

Làm thế nào để điều khiển LED RGB - Led 3 màu

Cũng đã khá lâu kể từ lần cuối mình viết bài chia sẻ với Cộng đồng Arduino Việt Nam. Mấy hôm nay, mình có một dự án liên quan đến LED RGB (Led 3 màu - led có thể biểu diễn tất cả các màu), mà tìm tài liệu trên Cộng đồng Arduino lại không có, vì vậy, mình sẽ viết một bài viết để chia sẻ cho các bạn đi sau.

Mục tiêu mà mình hướng đến và muốn chia sẻ trong bài viết này đó là giới thiệu về LED RGB và chỉ các bạn điều khiển 1 con LED RGB. Còn muốn điều khiển nhiều con LED RGB thì cần nhiều đồ hơn và phức tạp hơn nên mình xin nhường lại vấn đề này cho các bạn tìm hiểu thêm và chia sẻ cho cộng đồng.

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