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

Vòng đeo tay hỗ trợ người mù

Dự án là một vòng đeo tay hỗ trợ cho người mù có trọng lượng khá nhẹ chỉ khoảng 65g, có thể sạc pin khi hết, sử dụng cảm biến khoảng cách hc-sr04 và những thứ sẵn có xung quanh chúng ta. Mình mong muốn đóng góp sản phẩm này với hy vọng, nó sẽ sẽ giúp người mù đi lại được tốt hơn bằng việc thông báo cho họ âm thanh hoặc rung động khi đến gần vật cản. Với một chút kiến thức về Arduino bất cứ ai cũng có thể làm được điều này. Thiết bị dễ dàng đeo và tháo ra khỏi tay một cách nhanh chóng. Các bạn cùng chiêm ngưỡng nhé!

lên
15 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ả

Giới thiệu về các loại hộp số (bộ giảm tốc) chúng ta thường dùng khi làm xe mô hình với Arduino

Là một người yêu thích chế tạo xe, vì vậy mình mong muốn truyền cảm hứng cho các bạn yêu thích Arduino có thể tự làm cho mình một chiếc xe điều khiển từ xa. Tuy nhiên, khi mình triển khai hướng dẫn thì có nhiều bạn hỏi về các loại hộp số dùng cho xe mô hình. Vì vậy, hôm nay, mình sẽ tổng hợp các loại hộp số thường dùng trong xe mô hình điều khiển từ xa.

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

Quy đổi độ ẩm đất thành phần trăm (%) với Arduino

Bài viết về cảm biến độ ẩm đất của bạn Đỗ Hữu Toàn rất hay. Tuy nhiên, bạn ý không nhắc đến phương pháp quy đổi độ ẩm từ analog sang tỉ lệ phần trăm. Qua bài viết này, mình sẽ hướng dẫn các bạn làm được điều đó.

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