142 lines
3.2 KiB
Lua
Executable File
142 lines
3.2 KiB
Lua
Executable File
-- LuaProfiler
|
|
-- Copyright Kepler Project 2005-2007 (http://www.keplerproject.org/luaprofiler)
|
|
-- $Id: summary.lua,v 1.5 2007/08/22 21:05:13 carregal Exp $
|
|
|
|
-- Function that reads one profile file
|
|
function ReadProfile(file)
|
|
|
|
local profile
|
|
|
|
-- Check if argument is a file handle or a filename
|
|
if io.type(file) == "file" then
|
|
profile = file
|
|
|
|
else
|
|
-- Open profile
|
|
profile = io.open(file)
|
|
end
|
|
|
|
-- Table for storing each profile's set of lines
|
|
line_buffer = {}
|
|
|
|
-- Get all profile lines
|
|
local i = 1
|
|
for line in profile:lines() do
|
|
line_buffer[i] = line
|
|
i = i + 1
|
|
end
|
|
|
|
-- Close file
|
|
profile:close()
|
|
return line_buffer
|
|
end
|
|
|
|
-- Function that creates the summary info
|
|
function CreateSummary(lines, summary)
|
|
|
|
local global_time = 0
|
|
|
|
-- Note: ignore first line
|
|
for i = 2, table.getn(lines) do
|
|
word = string.match(lines[i], "[^\t]+\t[^\t]+\t([^\t]+)")
|
|
local_time, total_time = string.match(lines[i], "[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+\t([^\t]+)\t([^\t]+)")
|
|
if not (local_time and total_time) then return global_time end
|
|
if summary[word] == nil then
|
|
summary[word] = {};
|
|
summary[word]["info"] = {}
|
|
summary[word]["info"]["calls"] = 1
|
|
summary[word]["info"]["total"] = local_time
|
|
summary[word]["info"]["func"] = word
|
|
|
|
else
|
|
summary[word]["info"]["calls"] = summary[word]["info"]["calls"] + 1
|
|
summary[word]["info"]["total"] = summary[word]["info"]["total"] + local_time;
|
|
end
|
|
|
|
global_time = global_time + local_time;
|
|
end
|
|
|
|
return global_time
|
|
end
|
|
|
|
-- Global time
|
|
global_t = 0
|
|
|
|
-- Summary table
|
|
profile_info = {}
|
|
|
|
-- Check file type
|
|
local verbose = false
|
|
local filename
|
|
if arg[1] == "-v" or arg[1] == "-V" then
|
|
verbose = true
|
|
filename = arg[2]
|
|
else
|
|
filename = arg[1]
|
|
end
|
|
if filename then
|
|
file = io.open(filename)
|
|
else
|
|
print("Usage")
|
|
print("-----")
|
|
print("lua summary.lua [-v] <profile_log>")
|
|
os.exit()
|
|
end
|
|
if not file then
|
|
print("File " .. filename .. " does not exist!")
|
|
os.exit()
|
|
end
|
|
firstline = file:read(11)
|
|
|
|
-- File is single profile
|
|
if firstline == "stack_level" then
|
|
|
|
-- Single profile
|
|
local lines = ReadProfile(file)
|
|
global_t = CreateSummary(lines, profile_info)
|
|
|
|
else
|
|
|
|
-- File is list of profiles
|
|
-- Reset position in file
|
|
file:seek("set")
|
|
|
|
-- Loop through profiles and create summary table
|
|
for line in file:lines() do
|
|
|
|
local profile_lines
|
|
|
|
-- Read current profile
|
|
profile_lines = ReadProfile(line)
|
|
|
|
-- Build a table with profile info
|
|
global_t = global_t + CreateSummary(profile_lines, profile_info)
|
|
end
|
|
|
|
file:close()
|
|
end
|
|
|
|
-- Sort table by total time
|
|
sorted = {}
|
|
for k, v in pairs(profile_info) do table.insert(sorted, v) end
|
|
table.sort(sorted, function (a, b) return tonumber(a["info"]["total"]) > tonumber(b["info"]["total"]) end)
|
|
|
|
-- Output summary
|
|
if verbose then
|
|
print("Node name\tCalls\tAverage per call\tTotal time\t%Time")
|
|
else
|
|
print("Node name\tTotal time")
|
|
end
|
|
for k, v in pairs(sorted) do
|
|
if v["info"]["func"] ~= "(null)" then
|
|
local average = v["info"]["total"] / v["info"]["calls"]
|
|
local percent = 100 * v["info"]["total"] / global_t
|
|
if verbose then
|
|
print(v["info"]["func"] .. "\t" .. v["info"]["calls"] .. "\t" .. average .. "\t" .. v["info"]["total"] .. "\t" .. percent)
|
|
else
|
|
print(v["info"]["func"] .. "\t" .. v["info"]["total"])
|
|
end
|
|
end
|
|
end
|
|
|