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

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

Vỏ hộp cho ARDUINO UNO

Tự làm 1 chiếc vỏ hộp bảo vệ cho ARDUINO UNO của bạn chưa bao giờ đơn giản như thế này. Chỉ việc đem file dxf của mình ra ngoài tiệm cắt laser (quảng cáo và cắt thôi)!

Mình mới học ARDUINO cũng được khoảng 1 tuần thôi, đọc bài viết trên page cũng nhiều nhưng chả đóng góp được gì. Hôm nay rãnh rỗi ngồi làm cái hộp cho con UNO vì mấy hôm trước mình toàn lót giấy phía dưới rồi đặt em nó lên thấy cũng bất tiện, nếu các bạn có hứng thú thì làm theo file cad mình để ở cuối bài nha.

lên
14 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Trình mô phỏng Raspberry Pi trên Linux với QEMU

Hiện nay việc sở hữu một board mạch Raspberry Pi đã không là quá khó đối với mọi người. Thế nhưng đôi khi bạn cần phải giả lập hệ thống của Raspberry Pi trên máy tính (linux) của bạn bởi những lý do sau:

  • Bạn cần dev và test cho một software trước khi chạy trên board
  • Bạn cần một môi trường giả lập để làm quen trước khi sắm cho mình một board thực sự
  • Bạn cần test tương tác giữa nhiều hệ thống

Nội dung bài viết này sẽ hướng dẫn cách cài đặt hệ thống giả lập Raspberry Pi trên máy tính linux

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

Tạo webserver với Intel Edison

Tạo webserver với Intel Edison như thế nào? Có khó không? Bài viết này sẽ hướng dẫn bạn tạo webserver với board mạch này. Mình thấy cực kì dễ luôn, bạn thử xem.

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