You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.8 KiB

local _, addonTable = ...
-- Upvalues
--- WOW API
local IsAddOnLoaded = IsAddOnLoaded
local LoadAddOn = LoadAddOn
--- Lua API
local table_wipe = table.wipe
local pairs = pairs
local Profiling = { DEFAULT_TIMER_LABEL = "Default", isTimerRunning = false, activeTimers = {}, accumulatedTimes = {} }
function Profiling:StartTimer(label)
if not self:IsProfilingEnabled() then
return
end
label = label or self.DEFAULT_TIMER_LABEL
if self.activeTimers[label] then
Rarity:Debug("Failed to start timer %s (already running)", label) -- Should be a NOTICE or similar
return
end
local startTime = self:GetCurrentTimeInMilliseconds()
self.activeTimers[label] = startTime
-- If it's is the first time this label was used, we'll initialize the total implicitly here
if not self:HasAccumulatedTime(label) then
self:ResetAccumulatedTime(label)
end
end
function Profiling:HasAccumulatedTime(label)
return self.accumulatedTimes[label] ~= nil
end
function Profiling:InspectAccumulatedTimes()
-- TODO: If clicked multiple times, it will open a new instance. But I guess we don't really care to fix this?
local isLoading, isLoaded = IsAddOnLoaded("Blizzard_DebugTools")
if not isLoaded then
Rarity:Debug("Loading Blizzard_DebugTools (required to use the Table Inspector)")
local success, reason = LoadAddOn("Blizzard_DebugTools")
if not success then
Rarity:Debug("Failed to open Table Inspector (Blizzard_DebugTools could not be loaded)")
return
end
end
-- This can't be cached as the addon isn't loaded automatically, and the global DisplayTableInspectorWindow won't be available
local tableInspectorInstance = _G["DisplayTableInspectorWindow"](self.accumulatedTimes, "Rarity Profiling Data")
tableInspectorInstance:SetDynamicUpdates(true)
end
function Profiling:ResetAccumulatedTime(label)
if not label then
return
end
Rarity:Debug("Reset accumulated profiling data for label %s", label)
self.accumulatedTimes[label] = 0
end
function Profiling:ResetAccumulatedTimes()
Rarity:Debug("Reset ALL accumulated profiling data")
for label, time in pairs(self.accumulatedTimes) do
-- If we just re-assign the table, the Table Inspector's dynamic updates will stop working and we have to re-open it (I think)
self:ResetAccumulatedTime(label)
end
end
function Profiling:GetAccumulatedTime(label)
return self.accumulatedTimes[label]
end
function Profiling:AccumulateTime(label, timeInMilliseconds)
if not self:HasAccumulatedTime(label) then
self:ResetAccumulatedTime(label)
end
self.accumulatedTimes[label] = self.accumulatedTimes[label] + timeInMilliseconds
end
local GetTimePreciseSec = _G.GetTimePreciseSec
local MS_PER_SECOND = 1000
function Profiling:GetCurrentTimeInMilliseconds()
return GetTimePreciseSec() * MS_PER_SECOND
-- Relying on debugprofilestop() is risky, as it could be reset globally via debugprofilestart()
-- return debugprofilestop()
end
function Profiling:EndTimer(label)
if not self:IsProfilingEnabled() then
return
end
label = label or self.DEFAULT_TIMER_LABEL
local startTime = self.activeTimers[label]
if not startTime then
Rarity:Debug("Failed to end timer %s (no such timer is active)", label)
return
end
local endTime = self:GetCurrentTimeInMilliseconds()
local elapsedTimeInMilliseconds = endTime - startTime
self:AccumulateTime(label, elapsedTimeInMilliseconds)
self.activeTimers[label] = nil
Rarity:ProfileDebug(format("%s: %.2f ms", label, elapsedTimeInMilliseconds))
end
function Profiling:GetTimer(label)
if not self:IsProfilingEnabled() then
return
end
label = label or self.DEFAULT_TIMER_LABEL
return self.activeTimers[label]
end
function Profiling:IsProfilingEnabled()
return Rarity.db.profile.enableProfiling
end
Rarity.Profiling = Profiling
return Profiling