评估Python中不同嵌入式算法的性能

描述

Python在嵌入式应用程序开发中变得越来越普遍,特别是对于在网络边缘运行的机器学习框架。但是,这种高级通用编程语言抽象出代码中的许多细节,这些细节可能会以开发人员可能没有意识到的方式影响实现的性能。

让我们举一个明显的例子:计算斐波那契数列。至少有两种不同的方法可以执行此操作,递归算法和标准迭代算法,其性能级别差异很大。

可以使用名为跟踪测试器的工具评估不同实现或算法的性能。这是Percepio的可视化跟踪诊断工具,使嵌入式软件开发人员能够在运行时深入了解代码,以便更轻松地调试系统级问题,并帮助他们改进软件的设计和性能。

Tracealyzer 可以与开源 Eclipse 工具等传统调试器并排使用,并通过系统级的几个附加视图补充详细的调试器视图。这有助于了解经典调试器不足的实时问题。

结合 Linux 操作系统发行版中的 LTTng 开源跟踪包,跟踪测试程序可以显示不同级别的性能。这与处理器无关,并且是所选算法的结果。

对于评估,斐波那契数列的每个实现都在单个模块中执行:

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 中捕获跟踪,然后可以在跟踪测试器中对其进行检查:

$> lttng create

$> lttng enable-event --kernel sched_switch

$> lttng enable-event --python my-logger

$> lttng start

$> python3 .py

$> lttng stop

$> lttng destroy

嵌入式

将标准的 Python 记录器替换为称为“我的记录器”,允许跟踪测试程序在工具的跟踪视图中显示事件。由于 Tracealyzer 在此特定示例中未捕获任何应用程序数据,因此无需将软件配置为读取数据值。相反,所需要的只是一个自定义间隔,用于标记两个函数的进入和退出。

虽然在上面的跟踪视图中可以看到巨大的性能差异,但 Tracealyzer 还可以提供更多有形的性能指标。这可以通过转到视图并单击“间隔”和“状态机”来完成,并使用代码中随 logger.info()调用一起插入的“开始”和“停止”字符串创建自定义间隔,这些字符串标记候选函数的进入和退出。

嵌入式

区间图显示递归算法(首先执行)和迭代算法(第二次执行)之间存在 20 倍的差异。

在这个例子中,我们用每个算法只计算10个斐波那契数列。如果没有 Tracealyzer,可能需要进行更多的迭代才能获得一些有意义的见解,但由于两个原因,这是有问题的。首先,当将递归斐波那契算法运行到1000(甚至100)时,Python将简单地坐在那里。这将是令人担忧的,因为不清楚这种无响应是由于实现中的错误还是其他原因造成的。在这种情况下,我们可能可以猜测为什么会发生这种情况,但是对于更复杂的问题,需要大量的日志记录才能了解瓶颈的位置。

其次,如果嵌入式系统上运行多个应用程序,则这些其他应用程序可能会破坏目标应用程序,这也会增加算法或函数完成执行的时间。没有痕迹,就没有简单的方法来找出是否是这种情况。

相反,Python和跟踪测试器中LTTng的组合突出了所选择算法的基本特征才是问题所在。在开发更复杂的算法时,这是非常宝贵的。此示例实现可作为有关如何评估未来算法实现性能的参考。一般来说,在单独的Python模块中实现核心功能是良好的编程实践,这也简化了特定功能的跟踪。

由于跟踪开销几乎可以忽略不计,因此跟踪点可以保留在应用程序中,因为它在目标嵌入式系统上甚至在生产中进行测试,从而允许 Tracealyzer 工具在生产代码库中生成性能指标。这对于常规系统测试非常有用,并且允许使用相同的代码库来确保应用程序在功能上正确且性能良好,只需进行最少的更改。

结论

使用跟踪测试程序和 LTTng 在 Python 应用程序中捕获性能指标,可以对算法的实现进行宝贵的分析。

这种方法的开销最小,这意味着可以保留代码的检测,以便在目标嵌入式系统上使用。这样可以对目标应用程序进行更多监视,并增强与其他应用程序和操作系统的交互分析。例如,可能有另一个进程或线程抢占目标应用程序并影响性能。跟踪测试程序和 LTTng 的组合可以识别此类异常的原因,这使开发人员能够优化实现以防止进一步的问题。

虽然斐波那契数列的示例实现相对无害,但它突出了Python语言的一个关键特征,可以为开发更复杂的实现提供信息。

此示例还显示了在设计中使用单独模块的价值。使用 trace,开发人员可以在扩展到完整的系统实现之前,在这些模块中测量和验证关键核心功能的性能,而不会产生显著的开销。这有助于证明应用程序在功能上是正确的,并且在目标环境中进行最小的更改时性能良好。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分