Python 在嵌入式應用程序開發中變得越來越普遍,特別是對于在網絡邊緣運行的機器學習框架。但是,這種高級通用編程語言抽象出代碼中的許多細節,這些細節可能會以開發人員可能不知道的方式影響實現的性能。
讓我們舉一個明顯的例子:計算 斐波那契數列。至少有兩種不同的方法可以執行此操作,遞歸算法和標準迭代算法,性能水平差異很大。
可以使用稱為 Tracealyzer 的工具評估不同實現或算法的性能。這是來自 Percepio 的可視化跟蹤診斷工具,可讓嵌入式軟件開發人員在運行時深入了解代碼,以便更輕松地調試系統級問題,并幫助他們改進軟件的設計和性能。
Tracealyzer 可以與傳統調試器(如開源 Eclipse 工具)并排使用,并通過系統級別的幾個附加視圖補充詳細的調試器視圖。這有助于理解經典調試器不足以解決的實時問題。
結合Linux 操作系統發行版中的LTTng開源跟蹤包,Tracealyzer 可以展示不同級別的性能。這與處理器無關,并且是所選算法的結果。
對于評估,斐波那契數列的每個實現都在一個模塊中執行:
def recur_fibo(n):
if n 《=1 n:
return n
else:
return(recur_fibo(n-1) + recur_fibo(n-2))
def non_recur_fibo(n):
result = []
a,b = 0,1
while a 《 n:
result.append(a)
a,b = b, a+b
return result
有單獨的 Python 源文件調用上面的兩個函數:
import lttngust
import logging
import fib
def example():
logging.basicConfig()
logger = logging.getLogger(‘my-logger’)
logger.info(‘Start’)
fib.recur_fibo(10)
logger.info(‘Stop’)
logger.info(‘Start’)
fib.non_recur_fibo(10)
logger.info(‘Stop’)
if __name__ == ‘__main__’:
example()
以下命令捕獲 LTTng 中的跟蹤,然后可以在 Tracealyzer 中檢查:
$》 lttng 創建
$》 lttng 啟用事件--kernel sched_switch
$》 lttng 啟用事件--python my-logger
$》 lttng 開始
$》 蟒蛇3.py
$》 lttng 停止
$》 lttng 銷毀
將標準 Python 記錄器替換為名為“my-logger”的記錄器允許 Tracealyzer 在工具的跟蹤視圖中顯示事件。由于 Tracealyzer 在此特定示例中未捕獲任何應用程序數據,因此無需將軟件配置為讀取數據值。相反,只需要一個自定義間隔來標記兩個函數的進入和退出。
雖然在上面的跟蹤視圖中可以看到顯著的性能差異,但 Tracealyzer 還可以提供更具體的性能指標。這可以通過轉到視圖并單擊間隔和狀態機來完成,并使用代碼中的 logger.info() 調用插入的“開始”和“停止”字符串創建自定義間隔,并標記條目和候選函數的退出。
區間圖顯示遞歸算法(首先執行)和迭代算法(其次執行)之間存在 20 倍的差異。
在此示例中,我們僅使用每種算法計算 10 個斐波那契數。如果沒有 Tracealyzer,可能需要更多的迭代才能獲得一些有意義的見解,但這有兩個問題。首先,當遞歸 Fibonacci 算法運行到 1000(甚至 100)時,Python 會簡單地坐在那里。這將是令人擔憂的,因為不清楚這種不響應是由于實現中的錯誤還是其他原因。在這種情況下,我們可能會猜到為什么會發生這種情況,但是對于更復雜的問題,需要大量的日志記錄來了解瓶頸在哪里。
其次,如果在嵌入式系統上運行多個應用程序,這些其他應用程序可能會破壞目標應用程序,這也會增加算法或函數完成執行的時間。沒有蹤跡,就沒有簡單的方法來確定是否是這種情況。
相反,Python 中的 LTTng 和 Tracealyzer 的結合突出表明,問題在于所選算法的基本特征。這在開發更復雜的算法時非常寶貴。此示例實現可作為如何評估未來算法實現的性能的參考。在單獨的 Python 模塊中實現核心功能通常是一種很好的編程習慣,這也簡化了對特定功能的跟蹤。
由于跟蹤開銷幾乎可以忽略不計,跟蹤點可以保留在應用程序中,因為它在目標嵌入式系統甚至生產中進行測試,從而允許 Tracealyzer 工具在生產代碼庫中生成性能指標。這對于常規系統測試非常有用,并且允許使用相同的代碼庫來確保應用程序在功能上正確且高性能,而只需進行最少的更改。
結論
使用 Tracealyzer 和 LTTng 捕獲 Python 應用程序中的性能指標提供了對算法實現的寶貴分析。
這種方法的最小開銷意味著可以保留代碼的檢測以在目標嵌入式系統上使用。這可以對目標應用程序進行更多監控,并促進對與其他應用程序和操作系統交互的分析。例如,可能有另一個進程或線程搶占目標應用程序并影響性能。Tracealyzer 和 LTTng 的組合可以識別此類異常的原因,這允許開發人員改進實現以防止進一步的問題。
雖然斐波那契數列的示例實現相對無害,但它突出了 Python 語言的一個關鍵特征,可以為更復雜實現的開發提供信息。
此示例還顯示了在設計中使用單獨模塊的價值。使用跟蹤,開發人員可以在擴展到完整的系統實現之前測量和驗證這些模塊中關鍵核心功能的性能,而無需大量開銷。這有助于證明應用程序在功能上正確且性能良好,且目標環境中的更改最少。
審核編輯:郭婷
-
嵌入式
+關注
關注
5087文章
19145瀏覽量
306124 -
python
+關注
關注
56文章
4799瀏覽量
84817
發布評論請先 登錄
相關推薦
評論