[✔️]lua性能分析工具原理简介

简介: [✔️]lua性能分析工具原理简介

unity



image.png


unreadl



image.png


lua_sethook


lua_sethook 函数用于给指定的 lua_State 设置钩子函数。它的函数原型为:


lua_Hook lua_sethook(lua_State *L, lua_Hook func, int mask, int count);


函数的参数意义如下:


  • L:要设置钩子函数的 lua_State。


  • func:钩子函数的实际函数,类型为 lua_Hook(typedef 定义的函数指针类型)。


  • mask:一个掩码,指定了要使用哪些类型的钩子。它由下面几个常量按位或组合而成:


  • LUA_MASKCALL:当 Lua 调用函数时发生。


  • LUA_MASKRET:当函数返回时发生。


  • LUA_MASLINE:当执行一行指令时发生。


  • LUA_MASKCOUNT:当 Lua 执行指定数量的指令时发生。


  • LUA_MASKALL:包括所有钩子类型。


  • count:钩子函数被调用的频率。对于 LUA_MASKCOUNT 钩子类型有特殊意义,指定了多少条指令后触发一次钩子函数。对于其他钩子类型,该参数可以是任意整数。


在上述代码中,lua_sethook(L, myhook, LUA_MASKCOUNT, 1) 指定了使用 LUA_MASKCOUNT 类型的钩子,并将钩子函数 myhook 注册到 L 中,设定每执行一条 Lua 指令时,都会调用 myhook 一次。因此,当执行一行指令后,myhook 函数就会被调用一次,完成对 Lua 程序指令计数的操作。


需要注意的是,Lua 中的钩子机制需要仔细设计,因为它可能会影响程序性能,滥用钩子功能可能会导致程序出现难以调试或理解的问题。建议在使用钩子之前对钩子的运作原理进行深入研究,并充分测试和验证代码的正确性。


lua_getinfo


lua_getinfo 函数用于获取指定调用层次上的函数信息。这个函数可以在钩子函数中使用,也可以在 Lua 中调用。以下是该函数的详细说明:


int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);


该函数接受三个参数:


  • L:Lua 状态机。


  • what:一个字符串常量,表示要获取的信息。它由一系列控制字符组成,每个字符表示要获取的某一类信息。以下是可用的控制字符列表:


  • 'n':函数名。


  • 'S':Lua 源码文件名。


  • 'l':代码在源码文件中所在的行号。


  • 'f':函数地址。


  • 'L':当前层次的栈信息。


  • 'u':协程信息。


  • 't':关于主函数或尾调用的信息。


  • 'r':关于正在运行的函数的信息。


  • 其中,'n''S''l' 是最常用的控制字符。同时指定多个控制字符的方式是将它们组合在一起,例如 "Sln" 表示获取函数名、Lua 源码文件名和代码行号信息。


  • ar:一个 lua_Debug 结构体指针,用于存储获取到的信息。


该函数返回一个整数值表示操作是否成功。如果成功,返回 1;否则返回 0。如果传递了无效参数,例如 what 包含了未定义的控制字符,则返回 0。


在调用 lua_getinfo 函数后,如果获取到了所需信息,则这些信息会被存储在 lua_Debug 结构体中。例如:


lua_Debug ar;
lua_getinfo(L, "nSl", &ar);
std::cout << "function name: " << ar.name << std::endl;   // 函数名
std::cout << "source file name: " << ar.source << std::endl;  // 源码文件名
std::cout << "current line number: " << ar.currentline << std::endl;  // 当前行号


在以上示例中,我们通过将 "nSl" 作为 what 参数传递给 lua_getinfo 函数,来获取函数名、源码文件名和代码行号信息。注意,在获取某些信息(例如代码行号)时,你需要在 Lua 中开启调试模式(通过 lua_sethook 函数实现)。此外,lua_getinfo 函数的效率较低,如果需要高效性能的话,建议仅获取必要的信息,并尽量减少调用次数。


注意:


使用 lua_getinfo 函数获取 Lua 函数信息时,该函数会将相关信息压入堆栈中,这些信息以一个 Lua 表(table)的形式保存在堆栈顶部。


验证代码


int size1 = lua_gettop(L); // 0
lua_getinfo(L, "Slnf", ar);
int size2 = lua_gettop(L); // 1


实现原理


大部分 Lua 性能分析工具通常使用了以下几个接口:


  1. lua_getinfo - 获取函数的信息。可以用于获取当前正在执行的函数的调用信息,包括当前执行的行号、文件名等。


  1. lua_sethook - 设置钩子函数。通过设置钩子函数可以在程序执行过程中插入额外的操作,例如收集执行时间、记录调用深度等。其中的 mask 参数可以根据需要选择不同的钩子类型,例如调用、返回和行数。


  1. lua_toclose - 获取当前函数所在的执行环境。当调用栈的某一层被弹出时,会调用该函数来获得该层的上下文信息。


通过这些接口,性能分析工具可以跟踪函数调用、捕获函数执行时间并输出相关信息,从而帮助开发人员发现程序瓶颈并优化性能。


除此之外,还有一些其他的 Lua 接口可以用于性能分析,例如 lua_pcalllua_nextlua_pushstring 等。开发人员也可以根据自己的需求以及对 Lua 内部机制的深入理解,设计更加专业、高效的性能分析工具。


目录
相关文章
|
6月前
|
算法 Unix Linux
【C/C++ 实用工具】性能分析工具一览
【C/C++ 实用工具】性能分析工具一览
298 0
|
6月前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
958 2
|
6月前
|
Web App开发 JavaScript 前端开发
JavaScript中的性能优化:代码优化技巧与性能分析工具
【4月更文挑战第22天】本文探讨JavaScript性能优化,包括代码优化技巧和性能分析工具。建议避免全局查找、减少DOM操作、使用事件委托、优化循环和异步编程以提升代码效率。推荐使用Chrome DevTools、Lighthouse和jsPerf等工具进行性能检测和优化。持续学习和实践是提升JavaScript应用性能的关键。
|
13天前
|
监控 PyTorch 数据处理
通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析
在 PyTorch 中,`pin_memory` 是一个重要的设置,可以显著提高 CPU 与 GPU 之间的数据传输速度。当 `pin_memory=True` 时,数据会被固定在 CPU 的 RAM 中,从而加快传输到 GPU 的速度。这对于处理大规模数据集、实时推理和多 GPU 训练等任务尤为重要。本文详细探讨了 `pin_memory` 的作用、工作原理及最佳实践,帮助你优化数据加载和传输,提升模型性能。
48 4
通过pin_memory 优化 PyTorch 数据加载和传输:工作原理、使用场景与性能分析
|
17天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
61 1
|
17天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
22 1
|
1月前
|
Web App开发 监控 JavaScript
一些常用的 Vue 性能分析工具
【10月更文挑战第2天】
75 1
|
2月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
2月前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。
|
6月前
|
监控 Java 开发者
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
【5月更文挑战第21天】本文介绍了Java性能优化的两个利器——JProfiler和VisualVM。JProfiler通过CPU Profiler、内存分析器和线程视图帮助解决过度CPU使用、内存泄漏和线程阻塞问题;VisualVM则聚焦于GC行为调整和类加载优化,以减少内存压力和提高应用性能。使用这些工具进行定期性能检查,是提升Java应用效率的关键。
173 0