layout: post comments: true title: "[意外走向] 大疆机甲大师Python API之八:计时 -- 为性能测试展开1000次循环" description: date: 2019-10-28 00:00:00 -0700
为机甲的计时API写了如下例程,想对比一下PC上的Python性能(注:作为性能测试非常粗糙,因为主要是想作最简单的演示之用):
def 开始():
工具.计时器(常量.开始)
总耗时 = 0
次数 = 0
while 次数 < 10:
算三角函数()
工具.计时器(常量.暂停)
总耗时 = 工具.累计计时()
次数 += 1
print(总耗时 / 次数)
def 算三角函数():
积 = 1.0
for 次数 in range(1, 1000):
for 角度 in list(range(1, 360)):
弧度 = 数学.弧度(角度)
积 *= 数学.正弦(弧度)**2 + 数学.余弦(弧度)**2
return 积
因为原始代码在PC的运行时间很短,因此当机甲的控制台许久没打出结果的时候,小意外,于是测了求弧度和求平方和两句的分别耗时,结果,竟然瓶颈完全不在这。
排除法,只剩下了循环体本身(完整源码在此):
def 开始():
工具.计时器(常量.开始)
for 次数 in range(1, 501):
if 次数 % 100 == 0:
工具.计时器(常量.暂停)
print(str(次数) +": " + str(工具.累计计时()) + " seconds")
工具.计时器(常量.开始)
工具.计时器(常量.重置)
每100次空循环耗时0.56秒左右!虽然暂没写出实例,但这样的延时感觉会对运动控制算法产生不能忽视的影响。难怪上面的36万次循环会让它貌似宕机。
补:为避免循环体内的语句的影响,直接用pass,仍然一样,可见瓶颈在for循环:
试了while循环,也有类似延时。打算报告这个问题。
对比性能就不干了吗?决定还是继续试试。
于是,直接将两个循环展开,就是这样的上千行代码:
def 开始():
总耗时 = 0
工具.计时器(常量.开始)
结果 *= 算三角函数()
(真 -- 此处省去1000行代码)
结果 *= 算三角函数()
工具.计时器(常量.暂停)
总耗时 = 工具.累计计时()
print(str(总耗时) + " seconds, result : " + str(结果))
def 算三角函数():
积 = 1.0
弧度 = 数学.弧度(1)
积 *= 数学.正弦(弧度)**2 + 数学.余弦(弧度)**2
弧度 = 数学.弧度(2)
积 *= 数学.正弦(弧度)**2 + 数学.余弦(弧度)**2
(真 -- 此处省去700行代码)
弧度 = 数学.弧度(358)
积 *= 数学.正弦(弧度)**2 + 数学.余弦(弧度)**2
弧度 = 数学.弧度(359)
积 *= 数学.正弦(弧度)**2 + 数学.余弦(弧度)**2
return 积
得出的结果还比较合理,不过也领教了移动计算平台和PC的差别。一方面有计算性能的差距:ARMv7-A Cortex A7 1.5 GHz(参考:RoboMaster CPU and memory)VS. Intel Core i7-2635QM @ 2.00GHz。另外,也许在编译器优化也有区别?
回头研究一下Python递归,虽然觉得例程里总用递归代替循环不现实。