复杂模型的性能测试

对倒立摆模型和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()

测试结果

  1. 一共耗时9s。

  2. 花时间最多的依然是求解器/solver/fixed/rk.py,占比23.5%。耗时最多的代码行依次如下所示,这个顺序和之前的测试结果基本一致。

  3. 花费时间第二的是包装类dssim_core/model/system_proxy.py,时间占比为18.1%, 该类中花费时间最长的方法依次是: 其中花时间最多的仍然是collect_input_data方法。

  4. 花费时间第三的是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%。

  5. 接下来是dssim_core/model/base_system.py,时间占比为5.6%,花时最多的函数和代码行如下图所示。 这些函数都是在仿真过程中会调用的方法。

  6. transfer_fcn模块system_library/continuous/transfer_fcn/system.py的时间占比为4.7%. 该模块的derivative和output方法比较耗时。

  7. dssim_core/model/model_runtime.py占比2.5%,时间主要花费在以下函数上。

  8. 接下来是numpy的一些库函数,因为被调用比较频繁,所以也有一定的开销。 其中at_least2d开销最大,为1.8%。

  9. 整体的开销占比如下图所示。

rzip模型

测试模型说明

  1. 在gui中使用rzip模型,进行仿真。连接jupyter后,在jupyter中运行获取变量的函数,再在gui中选择run in jupyter,在用户当前路径下生成.roaming文件夹,里边的.sim_model.json文件就是仿真会用到的模型和求解器,将其拷贝出来。

  2. 由于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()
    

测试结果

  1. 和之前的测试结果相同,python3.8/threading.py占比为66.7%,将该文件exclude掉,测试结果如下,总时间为587.2s。

  2. 占用时间最多的是system_proxy,dssim_core/model/system_proxy.py,时间占比为24.9%。时间占比多的代码行如下所示: 时间占比多的函数如下所示,花时最多的依然是collect_input_data。

  3. 花时间第二的是求解器dssim_core/plugin/solver/fixed/rk.py,时间占比为24.1%。和之前的测试结果很相似。

  4. 第三的是product模块system_library/math_operation/product/system.py,时间占比为8.9%。 花时间最长的一行代码为if (np.array(data.shape) == np.ones(len(data.shape))).all():,花时间最多的函数为System.is_scalarSystem.ouput

  5. 第四是sum模块system_library/math_operation/sum/system.py,时间占比为4.5%。

  6. 接下来是dssim_core/model/base_system.py,占比4.4%。

  7. numpy的一些库函数耗时也比较大,numpy/core/shape_base.py占比4.2%,其中System.atleast_2d函数的时间占比为3.6%。numpy/core/_methods.py占比为4.1%。

  8. dssim_core/model/model_runtime.py时间占比为2.6%,其中ModelRuntime.solve方法花时最多。

  9. delay模块耗时1%。

  10. 内存花费时间如下图所示。

总结

  1. dssimDemo模型中时间占比:

    1. rk.py —— 20.1%

    2. system_proxy.py —— 11.2%

    3. numpy/core/shape_base.py —— 5.9%

    4. base_system.py —— 4.9%

    5. transfer_fcn/system.py ——2.6%

    6. model_runtime.py ——2.3%

    7. sinks/scope/system.py —— 2.3%

    8. step/system.py ——1.5%

  2. 倒立摆中时间占比靠前的有:

    1. rk.py —— 23.5%

    2. system_proxy —— 18.1%

    3. sum/system.py —— 6.9%

    4. base_system —— 5.6%

    5. transfer_fcn/system.py —— 4.7%

    6. model_runtime.py —— 2.5%

    7. numpy/core/shape_base.py —— 2.4%

  3. rzip中时间占比靠前的有:

    1. system_proxy —— 24.9%

    2. rk.py —— 24.1%

    3. product/system.py —— 8.9%

    4. sum/system.py —— 4.5%

    5. base_system —— 4.4%

    6. numpy/core/shape_base.py —— 4.2%

  4. 对比结果

    1. 随着模型复杂程度的增加,求解器的时间占比也在增加,不过幅度不大,20.1%—23.5%—24.1%。

    2. system_proxy的增加幅度比较大,11.2%—18.1%—24.9%,在rzip模型中超过了求解器的比重。

    3. 接下来就是模型用到的系统模块,以及base_system(占比始终在5%左右)

    4. 有个和之前不太一样的结果就是,模型复杂度提升之后,scope模块的时间占比并不高。倒立摆中只有一个scope,时间占比太小没有被统计。rzip中有接近30个scope,仍然花时间不多,没有统计到scope模块的时间占比。

    5. 优化方向主要放在rk.py和system_proxy.py上,目前还在尝试。

    6. 之前temporary分支有一块,为什么不对


本文章使用limfx的vscode插件快速发布