对倒立摆模型和rzip模型进行了scalene测试,结果与之前的测试结果几乎相同。
使用gui画的pid控制倒立摆的模型 在gui运行之后在用户当前路径下生成.roaming文件夹,里边的.sim_model.json文件就是仿真会用到的模型和求解器,使用engine.build
方法加载这个json。
from dssim_core import Engine
import json
engine = Engine()
with open('pendulum_model.json','r') as fp:
json_data = fp.read()
engine.build(json_data)
engine.simulate()
一共耗时9s。
花时间最多的依然是求解器/solver/fixed/rk.py
,占比23.5%。耗时最多的代码行依次如下所示,这个顺序和之前的测试结果基本一致。
花费时间第二的是包装类dssim_core/model/system_proxy.py
,时间占比为18.1%, 该类中花费时间最长的方法依次是: 其中花时间最多的仍然是collect_input_data方法。
花费时间第三的是sum模块system_library/math_operation/sum/system.py
,时间占比6.9%, 该系统花费时间最多在output上,占比为6.1%,其中花时间最多的一行代码为res = sign * data if res is None else res + sign * data
,该行的时间占比达到了5.1%。
接下来是dssim_core/model/base_system.py
,时间占比为5.6%,花时最多的函数和代码行如下图所示。 这些函数都是在仿真过程中会调用的方法。
transfer_fcn模块system_library/continuous/transfer_fcn/system.py
的时间占比为4.7%. 该模块的derivative和output方法比较耗时。
dssim_core/model/model_runtime.py
占比2.5%,时间主要花费在以下函数上。
接下来是numpy的一些库函数,因为被调用比较频繁,所以也有一定的开销。 其中at_least2d开销最大,为1.8%。
整体的开销占比如下图所示。
在gui中使用rzip模型,进行仿真。连接jupyter后,在jupyter中运行获取变量的函数,再在gui中选择run in jupyter,在用户当前路径下生成.roaming文件夹,里边的.sim_model.json文件就是仿真会用到的模型和求解器,将其拷贝出来。
由于scalene在jupyter中运行结果和cli中相差很大,且jupyter中的结果参考价值不大,所以在使用scalene测试的时候仍然选择使用cli命令测试。将读数据的程序写入测试文件,创建engine时指定user_ns参数值为locals(),因为使用到了自定义的库,所以对lib_paths参数也要传入库的路径。测试程序如下:
engine = Engine(user_ns=locals(),lib_paths=['/home/mhb/Documents/rzip_test/custom_library'])
with open('/home/mhb/Documents/rzip_test/rzip_model.json','r') as fp:
json_data = fp.read()
engine.build(json_data)
engine.simulate()
和之前的测试结果相同,python3.8/threading.py
占比为66.7%,将该文件exclude掉,测试结果如下,总时间为587.2s。
占用时间最多的是system_proxy,dssim_core/model/system_proxy.py
,时间占比为24.9%。时间占比多的代码行如下所示: 时间占比多的函数如下所示,花时最多的依然是collect_input_data。
花时间第二的是求解器dssim_core/plugin/solver/fixed/rk.py
,时间占比为24.1%。和之前的测试结果很相似。
第三的是product模块system_library/math_operation/product/system.py
,时间占比为8.9%。 花时间最长的一行代码为if (np.array(data.shape) == np.ones(len(data.shape))).all():
,花时间最多的函数为System.is_scalar
和System.ouput
。
第四是sum模块system_library/math_operation/sum/system.py
,时间占比为4.5%。
接下来是dssim_core/model/base_system.py
,占比4.4%。
numpy的一些库函数耗时也比较大,numpy/core/shape_base.py
占比4.2%,其中System.atleast_2d
函数的时间占比为3.6%。numpy/core/_methods.py
占比为4.1%。
dssim_core/model/model_runtime.py
时间占比为2.6%,其中ModelRuntime.solve
方法花时最多。
delay模块耗时1%。
内存花费时间如下图所示。
dssimDemo模型中时间占比:
rk.py —— 20.1%
system_proxy.py —— 11.2%
numpy/core/shape_base.py —— 5.9%
base_system.py —— 4.9%
transfer_fcn/system.py ——2.6%
model_runtime.py ——2.3%
sinks/scope/system.py —— 2.3%
step/system.py ——1.5%
倒立摆中时间占比靠前的有:
rk.py —— 23.5%
system_proxy —— 18.1%
sum/system.py —— 6.9%
base_system —— 5.6%
transfer_fcn/system.py —— 4.7%
model_runtime.py —— 2.5%
numpy/core/shape_base.py —— 2.4%
rzip中时间占比靠前的有:
system_proxy —— 24.9%
rk.py —— 24.1%
product/system.py —— 8.9%
sum/system.py —— 4.5%
base_system —— 4.4%
numpy/core/shape_base.py —— 4.2%
对比结果
随着模型复杂程度的增加,求解器的时间占比也在增加,不过幅度不大,20.1%—23.5%—24.1%。
system_proxy的增加幅度比较大,11.2%—18.1%—24.9%,在rzip模型中超过了求解器的比重。
接下来就是模型用到的系统模块,以及base_system(占比始终在5%左右)
有个和之前不太一样的结果就是,模型复杂度提升之后,scope模块的时间占比并不高。倒立摆中只有一个scope,时间占比太小没有被统计。rzip中有接近30个scope,仍然花时间不多,没有统计到scope模块的时间占比。
优化方向主要放在rk.py和system_proxy.py上,目前还在尝试。
之前temporary分支有一块,为什么不对
本文章使用limfx的vscode插件快速发布