mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
114
lua/fprofiler/report.lua
Normal file
114
lua/fprofiler/report.lua
Normal file
@@ -0,0 +1,114 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
local function getData()
|
||||
local callCounts = FProfiler.Internal.getCallCounts()
|
||||
local inclusiveTimes = FProfiler.Internal.getInclusiveTimes()
|
||||
local funcNames = FProfiler.Internal.getFunctionNames()
|
||||
|
||||
local data = {}
|
||||
for func, called in pairs(callCounts) do
|
||||
local row = {}
|
||||
row.func = func
|
||||
row.info = debug.getinfo(func, "nfS")
|
||||
row.total_called = called
|
||||
row.total_time = inclusiveTimes[func] or 0
|
||||
row.average_time = row.total_time / row.total_called
|
||||
|
||||
row.name, row.namewhat = nil, nil
|
||||
|
||||
row.names = {}
|
||||
for name, namedata in pairs(funcNames[func]) do
|
||||
table.insert(row.names, {name = name, namewhat = namedata.namewhat, nparams = namedata.nparams})
|
||||
end
|
||||
|
||||
table.insert(data, row)
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
local function cull(data, count)
|
||||
if not count then return data end
|
||||
|
||||
for i = count + 1, #data do
|
||||
data[i] = nil
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
The functions that are called most often
|
||||
Their implementations are O(n lg n),
|
||||
which is probably suboptimal but not worth my time optimising.
|
||||
---------------------------------------------------------------------------]]
|
||||
function FProfiler.Internal.mostOftenCalled(count)
|
||||
local sorted = getData()
|
||||
|
||||
table.SortByMember(sorted, "total_called")
|
||||
|
||||
return cull(sorted, count)
|
||||
end
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
The functions that take the longest time in total
|
||||
---------------------------------------------------------------------------]]
|
||||
function FProfiler.Internal.mostTimeInclusive(count)
|
||||
local sorted = getData()
|
||||
|
||||
table.SortByMember(sorted, "total_time")
|
||||
|
||||
return cull(sorted, count)
|
||||
end
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
The functions that take the longest average time
|
||||
---------------------------------------------------------------------------]]
|
||||
function FProfiler.Internal.mostTimeInclusiveAverage(count)
|
||||
local sorted = getData()
|
||||
|
||||
table.SortByMember(sorted, "average_time")
|
||||
|
||||
return cull(sorted, count)
|
||||
end
|
||||
|
||||
--[[-------------------------------------------------------------------------
|
||||
Get the top <count> of most often called, time inclusive and average
|
||||
NOTE: This will almost definitely return more than <count> results.
|
||||
Up to three times <count> is possible.
|
||||
---------------------------------------------------------------------------]]
|
||||
function FProfiler.Internal.getAggregatedResults(count)
|
||||
count = count or 100
|
||||
|
||||
local dict = {}
|
||||
local mostTime = FProfiler.Internal.mostTimeInclusive(count)
|
||||
for i = 1, #mostTime do dict[mostTime[i].func] = true end
|
||||
|
||||
local mostAvg = FProfiler.Internal.mostTimeInclusiveAverage(count)
|
||||
|
||||
for i = 1, #mostAvg do
|
||||
if dict[mostAvg[i].func] then continue end
|
||||
dict[mostAvg[i].func] = true
|
||||
table.insert(mostTime, mostAvg[i])
|
||||
end
|
||||
|
||||
local mostCalled = FProfiler.Internal.mostOftenCalled(count)
|
||||
|
||||
for i = 1, #mostCalled do
|
||||
if dict[mostCalled[i].func] then continue end
|
||||
dict[mostCalled[i].func] = true
|
||||
table.insert(mostTime, mostCalled[i])
|
||||
end
|
||||
|
||||
table.SortByMember(mostTime, "total_time")
|
||||
|
||||
return mostTime
|
||||
end
|
||||
Reference in New Issue
Block a user