243 lines
6.7 KiB
Plaintext
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 |