actboy168 / YDWE

A Tool to Help the Creation of Warcraft III Map
GNU General Public License v3.0
463 stars 139 forks source link

call_native有性能问题,需要优化 #219

Open w4454962 opened 1 year ago

w4454962 commented 1 year ago

在高频率执行native函数时 测试下来性能不佳,

call_param类使用了 3个vector 每次调用时,即使是局部变量 也都会从堆里动态申请内存 再回收,造成性能性能问题,应该改为栈内存 避免分配回收。

image

尤其是lua引擎里 会大量使用, 所以提一下可以注意优化。

w4454962 commented 1 year ago

我忽然发现为什么当年 小汐说lua的性能不如jass的原因了, 实在是因为ydlua引擎底层交互有问题

还有一些地方需要优化

1 每次访问 jass.common jass.japi 都会生成新的闭包 造成性能问题

2 调用 is_gaming() get_jass_thread() get_jass_vm() 等函数里 都 依赖了 get_war3_searcher() 里面的单例对象 单例对象使用静态局部变量 为了保证线程安全每次调用时都会从tls获取数据,高频率调用时会掉帧

3 lua调用native函数 是先将 参数 写入到容器里 再从 容器复制到栈里 一方面容器是堆内存 有分配回收问题,一方面对比jass虚拟机指令,多了一次参数复制的操作, 调用可以不需要容器 不需要参数复制 直接push 到栈里会快很多。

actboy168 commented 1 year ago

lua的优点是可以大幅度的减少native函数的调用。用得好肯定没问题,用得不好怎么着都是问题。

w4454962 commented 1 year ago

我最近在重写替换jass虚拟机指令, 过程中用到你部分代码,反应出来性能比原本魔兽的要差一些,处理完上述问题,性能就达到相近的性能, 所以反馈一下而已。