From 4a576b348f255e718731521a11104f54b0f3efb7 Mon Sep 17 00:00:00 2001 From: nlordduck <223183259+n1lordduck@users.noreply.github.com> Date: Sun, 20 Sep 2026 20:58:54 -0300 Subject: [PATCH 1/3] perf(wirelib): optimize OutputIterator using a queue structure) --- lua/wire/server/wirelib.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lua/wire/server/wirelib.lua b/lua/wire/server/wirelib.lua index b3c09aa3f3..7c9c85b3f6 100644 --- a/lua/wire/server/wirelib.lua +++ b/lua/wire/server/wirelib.lua @@ -898,16 +898,22 @@ do -- class OutputIterator OutputIterator.__index = OutputIterator function OutputIterator:Add(ent, iname, value) - table.insert(self, { Entity = ent, IName = iname, Value = value }) + local last = self.last + 1 + + self.last = last + self[last] = { Entity = ent, IName = iname, Value = value } end function OutputIterator:Process() if self.Processing then return end -- should not occur self.Processing = true - while #self > 0 do - local nextelement = self[1] - table.remove(self, 1) + while self.first <= self.last do + local first = self.first + local nextelement = self[first] + + self[first] = nil + self.first = first + 1 WireLib.TriggerInput(nextelement.Entity, nextelement.IName, nextelement.Value, self) end @@ -916,7 +922,7 @@ do -- class OutputIterator end function WireLib.CreateOutputIterator() - return setmetatable({}, OutputIterator) + return setmetatable({ first = 1, last = 0 }, OutputIterator) end end -- class OutputIterator From 7b9f043051c17fecdedb930dcf1b0b5ac1996de9 Mon Sep 17 00:00:00 2001 From: Astralcircle <142503363+Astralcircle@users.noreply.github.com> Date: Mon, 21 Sep 2026 15:45:06 +0300 Subject: [PATCH 2/3] Reset values after ending processing --- lua/wire/server/wirelib.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/wire/server/wirelib.lua b/lua/wire/server/wirelib.lua index 7c9c85b3f6..e2cc184bf5 100644 --- a/lua/wire/server/wirelib.lua +++ b/lua/wire/server/wirelib.lua @@ -918,6 +918,9 @@ do -- class OutputIterator WireLib.TriggerInput(nextelement.Entity, nextelement.IName, nextelement.Value, self) end + self.first = 0 + self.last = 0 + self.Processing = nil end From 48861acef7f93c5395c88eecf2c190bf027871ab Mon Sep 17 00:00:00 2001 From: Astralcircle <142503363+Astralcircle@users.noreply.github.com> Date: Mon, 21 Sep 2026 16:04:19 +0300 Subject: [PATCH 3/3] Reset to 1 instead of 0 --- lua/wire/server/wirelib.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/wire/server/wirelib.lua b/lua/wire/server/wirelib.lua index e2cc184bf5..8d4a268622 100644 --- a/lua/wire/server/wirelib.lua +++ b/lua/wire/server/wirelib.lua @@ -918,7 +918,7 @@ do -- class OutputIterator WireLib.TriggerInput(nextelement.Entity, nextelement.IName, nextelement.Value, self) end - self.first = 0 + self.first = 1 self.last = 0 self.Processing = nil