2025-06-04 05:02:57 +08:00

243 lines
6.7 KiB
Plaintext

autoImport('json')
ProtocolStatistics = class("ProtocolStatistics")
local tabProtocolInfo = {}
-- {
-- [1] = { -- command 1
-- [1] = { -- command 2
-- {
-- packageSize = 1, -- package size
-- costTime = 1 -- cost time
-- },
-- }
-- }
-- }
ProtocolStatistics.time = 600
ProtocolStatistics.serverURL = 'https://127.0.0.1:5050/xd.game.ro.client'
local tablePool = {}
-- {
-- [1] = {
-- tab = {}, -- table
-- isIdle = true -- is idle
-- }
-- }
function ProtocolStatistics:GetTableFromPool()
for _, v in pairs(tablePool) do
local isIdle = v.isIdle
if isIdle then
v.isIdle = false
return v.tab
end
end
local newTable = {}
table.insert(tablePool, {isIdle = false, tab = newTable})
return newTable
end
function ProtocolStatistics:TableBackToPool(pTab)
for _, v in pairs(tablePool) do
local tab = v.tab
if tab == pTab then
v.isIdle = true
TableUtility.TableClear(tab)
break
end
end
end
function ProtocolStatistics:Instance()
if ProtocolStatistics.instance == nil then
ProtocolStatistics.instance = ProtocolStatistics.new()
end
return ProtocolStatistics.instance
end
function ProtocolStatistics:Start()
if not self.switch then
self.switch = true
if self.timer == nil then
self.timer = TimeTick.new(0, ProtocolStatistics.time * 1000, self.OnTimeTick, self, 1)
end
self.timer:StartTick()
self:ClearStatistics()
end
end
function ProtocolStatistics:Stop()
if self.switch then
self.switch = false
self:StopTimer()
end
end
function ProtocolStatistics:Close()
self.switch = false
self:CloseTimer()
end
function ProtocolStatistics:StopTimer()
if self.timer ~= nil then
self.timer:Stop()
end
end
function ProtocolStatistics:CloseTimer()
if self.timer ~= nil then
self.timer:ClearStick()
end
end
local ReceiveMem = 0
function ProtocolStatistics:Receive(command1, command2, package_size, cost_time)
local mem = collectgarbage("count")
if self.switch then
local tabContent = self:GetTableFromPool()
tabContent.packageSize = package_size; tabContent.costTime = cost_time
if table.ContainsKey(tabProtocolInfo, command1) and tabProtocolInfo[command1] ~= nil then
local tab1 = tabProtocolInfo[command1]
if table.ContainsKey(tab1, command2) and tab1[command2] ~= nil then
local tab2 = tab1[command2]
table.insert(tab2, tabContent)
else
local tabContents = self:GetTableFromPool()
table.insert(tabContents, tabContent)
tab1[command2] = tabContents
end
else
local tabCommand1Value = self:GetTableFromPool()
local tabCommand2Value = self:GetTableFromPool()
table.insert(tabCommand2Value, tabContent)
tabCommand1Value[command2] = tabCommand2Value
tabProtocolInfo[command1] = tabCommand1Value
end
end
ReceiveMem = ReceiveMem + (collectgarbage("count")-mem)
end
function ProtocolStatistics:OnTimeTick()
local mem = collectgarbage("count")
self:MakeStatistics()
local message = self:GetTableFromPool()
message.protocolCount = self.protocolCount
message.allPackageSize = self.allPackageSize
message.allCostTime = self.allCostTime
message.tabMinAndMax = self.tabMinAndMax
local strMessage = json.encode(message)
local str = 'json=' .. strMessage
local bytes = NetUtil.CharsToBytes(str, string.len(str))
HttpRequest.Instance:HTTPPost(ProtocolStatistics.serverURL, bytes, function (www)
end)
self:ClearStatistics()
-- LogUtility.InfoFormat("ProtocolStatistics:OnTimeTick {0} kb",collectgarbage("count")-mem)
-- LogUtility.InfoFormat("ProtocolStatistics:Receive {0} kb",ReceiveMem)
end
function ProtocolStatistics:ClearStatistics()
for k, v in pairs(tabProtocolInfo) do
local command1 = k
local tabCommand1Value = v
if tabCommand1Value ~= nil then
for k, v in pairs(tabCommand1Value) do
local command2 = k
local tabCommand2Value = v
if tabCommand2Value ~= nil then
for k, v in pairs(tabCommand2Value) do
local content = v
if content ~= nil then
self:TableBackToPool(content)
tabCommand2Value[k] = nil
end
end
self:TableBackToPool(tabCommand2Value)
tabCommand1Value[command2] = nil
end
end
self:TableBackToPool(tabCommand1Value)
tabProtocolInfo[command1] = nil
end
end
if self.tabMinAndMax ~= nil then
for k, v in pairs(self.tabMinAndMax) do
local command1 = k
local tabCommand1Value = v
if tabCommand1Value ~= nil then
for k, v in pairs(tabCommand1Value) do
local command2 = k
local tabCommand2Value = v
if tabCommand2Value ~= nil then
for k, v in pairs(tabCommand2Value) do
local content = v
if content ~= nil then
self:TableBackToPool(content.packageSize)
content.packageSize = nil
self:TableBackToPool(content.costTime)
content.costTime = nil
end
end
self:TableBackToPool(tabCommand2Value)
tabCommand1Value[command2] = nil
end
end
self:TableBackToPool(tabCommand1Value)
tabProtocolInfo[command1] = nil
end
end
end
end
function ProtocolStatistics:MakeStatistics()
self.protocolCount = 0
self.allPackageSize = 0
self.allCostTime = 0
self.tabMinAndMax = self:GetTableFromPool()
for k, v in pairs(tabProtocolInfo) do
local command1 = k
local tab1 = v
if tab1 ~= nil then
self.tabMinAndMax[tostring(command1)] = self:GetTableFromPool()
for k, v in pairs(tab1) do
local command2 = k
local tab2 = v
if tab2 ~= nil then
self.protocolCount = self.protocolCount + 1
local minPackageSize = 0
local maxPackageSize = 0
local minCostTime = 0
local maxCostTime = 0
for _, v in pairs(tab2) do
if v ~= nil then
local packageSize = v.packageSize
self.allPackageSize = self.allPackageSize + packageSize
if minPackageSize > 0 then
minPackageSize = ((packageSize < minPackageSize) and packageSize or minPackageSize)
else
minPackageSize = packageSize
end
maxPackageSize = ((packageSize > maxPackageSize) and packageSize or maxPackageSize)
local costTime = v.costTime
self.allCostTime = self.allCostTime + costTime
if minCostTime > 0 then
minCostTime = ((costTime < minCostTime) and costTime or minCostTime)
else
minCostTime = costTime
end
maxCostTime = ((costTime > maxCostTime) and costTime or maxCostTime)
end
end
local tabPackageSize = self:GetTableFromPool()
tabPackageSize.min = minPackageSize; tabPackageSize.max = maxPackageSize
local tabCostTime = self:GetTableFromPool()
tabCostTime.min = minCostTime; tabCostTime.max = maxCostTime
local tabContent = self:GetTableFromPool()
tabContent.packageSize = tabPackageSize; tabContent.costTime = tabCostTime
self.tabMinAndMax[tostring(command1)][tostring(command2)] = tabContent
end
end
end
end
end