找回密码
 立即注册
查看: 165|回复: 0

XLua性能分析工具

[复制链接]
发表于 2023-4-9 09:45 | 显示全部楼层 |阅读模式
XLua中内置了两个性能分析工具: 函数调用时常分析工具内存泄漏定位工具

函数调用时长分析工具

典型使用案例:
  1. local profiler = require 'perf.profiler'
  2. profiler.start()print("xxx")// ...print(profiler.report())
  3. profiler.stop()
复制代码
api很简单,就三个,start和stop都是无参数,也很好理解,分别是统计开始以及结束。在start以及stop之间可以多次调用report(也可以考虑不调stop)。每次report会得到从start到调用report为止的函数时长统计报告(以字符串返回)。report函数只有一个可选参数,可以指明按照总时间(参数是字符串的”TOTAL”,这个是默认值),平均每次调用时间(“AVERAGE”),以及调用次数(“CALLED”)来排序。
典型的一个时长统计报告如下:



第一列是函数名
第二列是源代码,如果是lua文件将会统计到文件,行号,如果是C#的导出代码,将会标注[C#],如果是C函数,标准为[C]。
后面几列分别是总时间,平均每次调用时间,占总统计时间的百分比,以及调用次数。
内存泄漏定位工具
典型使用案例:
  1. local memory = require 'perf.memory'print('total memory', memory.total())print(memory.snapshot())
复制代码
说明:
api就两个,total获取lua虚拟机的内存占用,单位是Kbytes,以lua number返回。而snapshot返回当前内存快照信息,一个典型的快照报告如下:



第一列是table变量名;
第二列是table的大小,如果该table下有子table也会被统计到;
第三列是变量的类型,UPVALUE代表是闭包里头的变量(内层函数对外层local变量的引用),GLOBAL是全局变量,REGISTRY是C侧(包含虚拟机内部的)的一些私有数据。一般主要关注前面两种;
第四列是变量的ID,其实就是内存指针,如果两次报告间没被重新分配,该ID是不变的,便于识别是否同一table;
最后一列是一些附加信息,比如闭包变量可能存在很多同名的,这里会通过有那些函数引用了该变量来协助定位。
如何定位内存泄漏:通过memory.total检测出内存的持续增长,然后通过memory.snapshot定位出哪里泄漏(lua测的内存泄漏都是表现为往某table添加了数据忘了删除)。
ps:可以写一个编辑器窗口实时显示性能分析快照信息TODO

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-21 14:11 , Processed in 0.128549 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表