24.3 性能分析

翻译 2013年12月05日 16:34:13
尽管它的名字中有“debug”,但是debug库在很多非调试方面也很有用。常见的任务就是用于性能分析。用于时间的性能分析最好使用C接口:因为Lua代码的hook调用开销很大,所以用于测试时间毫无意义。然而用于性能分析,Lua代码很适合。在本章中,我们开发一个初版本的分析工具,用于统计每个函数的调用次数。

两个table是我们程序中用到的主要数据结构:一个记录函数调用次数,另一个记录对应的函数名。函数本身是两个table的索引。
     local Counters = {}
     local Names = {}
我们可在分析之后,再去检索函数名。但是当我们在函数处于活动状态时,去检索函数名,会得到更好的结果。因为Lua会查找代码,在调用此函数的时候获得这个函数的名称。

现在我们来定义hook函数。函数的任务是获取被调函数,并增加相应的计数器;同时也收集函数名:
local function hook()
     local f = debug.getinfo(2, "f").func --2为此时调用的函数名
     local count = Counter[f]
     if count == nil then     -- 第一次调用函数的时候
          Counters[f] = 1
          Names[f] = debug.getinfo(2, "Sn")
     else -- 增加计数器
          Counters[f] = count + 1
     end
end

下一步是运行Lua程序,并设置这个hook函数。假设主程序在一个文件里面,文件名以参数的形式传给分析器,就像:
     % lua profiler main-prog

用这方法,分析器可以在arg[1]中得到文件名,接下来打开hook,运行文件:
     local f = assert(loadfile(arg[1]))
     debug.sethook(hook, "c")      -- 开启hook用于函数调用
     f()                                       -- 运行主程序
     debug.sethook()                   -- 关闭hook

最后一步输出结果。列表24.2中的函数getname,返回一个函数的名称。因为函数名在Lua中是不确定的,我们将函数出现的行号也标注出来,输出一对值“文件:行号”。如果一个函数没有名字,它就用位置表示。如果一个函数是C函数,我们只显示函数名(因为它没有位置)。如此定义以后,我们输出每个函数和它的计数器:
     for func, count in pairs(Counters) do
          print(getname(func), count)
     end
function getname(func)
    local n = Name[func]
    if n.what = "C" then
          return n.name
    end
     local lc = string.format("[%s]:%d", n.short_src, n.linedfined)
     if n.what ~= "main" and n.namewhat ~= "" then
          return string.format("%s (%s)", lc, n.name)
     else
          return lc
     end
end

我们调用10.3节中的程序,然后输出结果如下:

结果的意思是第四行是一个匿名函数(所有字段中都定义了inerater)调用过了884723次,write (io.write) 函数调用了10000次,等等。
这个分析器还有可以改进的地方,如果输出结果排序。不管如何,这个分析工具已经很有用了,并且可以作为后续开发的基础。

XHProf——php性能分析工具

XHProf是facebook开发的一个php扩展,用于采集php程序中每个函数的性能开销。采集的数据包括:内存消耗、CPU计算时间、函数执行时长等等。       XHProf同时提供了一套查...
  • liangjianquan10
  • liangjianquan10
  • 2014年11月24日 16:55
  • 581

探讨web前端性能分析

1、web前端性能----原理: 即是web用户在访问一个页面时所要花费的时间总和。即一个完全意义上的用户响应时间,相对于服务器的响应时间而言还会包括更多的内容和影响因素。那么一个web页面...
  • liaozhongping
  • liaozhongping
  • 2016年03月31日 19:00
  • 1437

带你玩转Visual Studio——性能分析与优化

二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少)。因此优化实践中,我们将精力集中优化那20...
  • luoweifu
  • luoweifu
  • 2016年05月21日 23:24
  • 27684

mysql性能分析

mysql> show global status;   可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:   mysql> show variables;   一、慢...
  • liunian02050328
  • liunian02050328
  • 2016年09月23日 16:24
  • 947

程序性能的初步优化与分析(以 C++ 为例)

去年圣诞节浏览了 Milo Yip 的文章 “如何用 C 语言画一棵圣诞树” 后,对这个圣诞树生成算法很感兴趣。 下面对这个程序,做一些简单的优化分析......
  • andytimes
  • andytimes
  • 2016年06月09日 02:59
  • 647

JVM--性能分析

转载自:http://blog.csdn.net/fenglibing/article/details/6411953 JDK内置工具使用 一、javah命令(C Header and St...
  • szzt_lingpeng
  • szzt_lingpeng
  • 2016年01月06日 11:37
  • 1858

程序性能分析及性能测试

这里所说的程序是指对外提供tcp/ip交互协议的服务性程序。网络程序性能分析很重要,比如随着网络请求流量越来越大,我们需要知道已部署的服务能不能满足需求。这里采用对网络服务程序进行建模的方法分析影响程...
  • MICweaver
  • MICweaver
  • 2014年11月08日 20:48
  • 7215

一款.net性能分析工具

以前一直是用ANTS Profiler进行.net程序的性能分析,但是有使用天数的限制,所以个人出于学习研究的目的,做了下破解。具体参见: http://www.cnblogs.com/studyzy...
  • studyzy
  • studyzy
  • 2013年09月10日 14:20
  • 1805

MYSQL sql 语句性能分析

在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过E...
  • u011244446
  • u011244446
  • 2017年03月06日 23:08
  • 1353

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具。它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的。在第2...
  • qq_28674045
  • qq_28674045
  • 2016年07月04日 11:20
  • 7001
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:24.3 性能分析
举报原因:
原因补充:

(最多只允许输入30个字)