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

Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 (-55°C đến +125°C) sai số ±0.5°C

Lại quay về vấn đề đo nhiệt độ, như ở bài trước, mình đã dùng cả LM35, cả TMP36. Nhưng rốt cuộc vẫn không hiệu quả, lần này mình đang sử dụng con DS18B20 này và cảm thấy khá ổn hơn so với lần trước. Nhiệt độ ít bị chênh lệch hơn và như quảng cáo là chỉ có sai số ±0.5°C thôi (nếu nhiệt độ trong phạm vi -10°C to +85°C, đáng để thử phải không nào?

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

Software Serial - Giao tiếp giữa Arduino và nhiều mạch Serial khác - Truyền tải trung gian giữa một mạch khác qua giao tiếp Serial

Có thể nói Serial là một trong những phương thức giao tiếp đơn giản nhất trong môi trường Serial. Vì bạn chỉ cần 2 dây và cách thức truyền dữ liệu của nó lại giống hệt stream trong các ngôn ngữ lập trình. Nhưng thật đáng tiết, con Arduino Uno chỉ có duy nhất một cổng Serial được phần cứng hỗ trợ sẵn (Mega thì 3). Vì vậy, nếu bạn muốn giao tiếp với nhiều module Serial thì đó là một chuyện không thể. Và đó chính là lý do vì sao thư viện Software Serial ra đời. Hôm nay, chúng ta sẽ tìm cách giao tiếp giữa 2 mạch Arduino thông qua Serial và một ví dụ về chuyển tiếp giá trị của một module giao tiếp qua Serial với thư viện này.

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