From f39fad8934b9e6878a3212fa6e79fd115e822131 Mon Sep 17 00:00:00 2001 From: Tobi Lutke Date: Thu, 12 Mar 2026 17:24:51 -0400 Subject: [PATCH] =?UTF-8?q?Condition#evaluate:=20skip=20loop=20block=20for?= =?UTF-8?q?=20simple=20conditions=20(no=20child=5Frelation)=20=E2=80=94=20?= =?UTF-8?q?saves=20235=20allocs\n\nResult:=20{"status":"keep","combined=5F?= =?UTF-8?q?=C2=B5s":3445,"parse=5F=C2=B5s":2284,"render=5F=C2=B5s":1161,"a?= =?UTF-8?q?llocations":24647}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autoresearch.jsonl | 2 ++ lib/liquid/condition.rb | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/autoresearch.jsonl b/autoresearch.jsonl index 7fa0376d..76eb5455 100644 --- a/autoresearch.jsonl +++ b/autoresearch.jsonl @@ -19,3 +19,5 @@ {"run":18,"commit":"b37fa98","metric":3629,"metrics":{"parse_µs":2455,"render_µs":1174,"allocations":25002},"status":"discard","description":"String.new(capacity: 4096) for output buffer: allocates more objects, not fewer","timestamp":1773350101852,"segment":0} {"run":19,"commit":"f6baeae","metric":3350,"metrics":{"parse_µs":2212,"render_µs":1138,"allocations":24882},"status":"keep","description":"parse_tag_token without StringScanner: pure byte ops avoid reset(token) overhead, -12% combined","timestamp":1773350230252,"segment":0} {"run":20,"commit":"f6baead","metric":0,"metrics":{"parse_µs":0,"render_µs":0,"allocations":0},"status":"crash","description":"REVERTED: regex ultra-fast path for Variable — name pattern too broad, matches invalid trailing dots","timestamp":1773350472859,"segment":0} +{"run":21,"commit":"ae9a2e2","metric":3314,"metrics":{"parse_µs":2203,"render_µs":1111,"allocations":24882},"status":"keep","description":"Clean confirmation run: 3,314µs (-55% from main), stable","timestamp":1773350544354,"segment":0} +{"run":22,"commit":"ae9a2e2","metric":3497,"metrics":{"parse_µs":2336,"render_µs":1161,"allocations":24882},"status":"discard","description":"Regex fast path for no-filter variables: include? + match? overhead exceeds byte scan savings","timestamp":1773350641375,"segment":0} diff --git a/lib/liquid/condition.rb b/lib/liquid/condition.rb index 9d55c42b..13f238d2 100644 --- a/lib/liquid/condition.rb +++ b/lib/liquid/condition.rb @@ -65,11 +65,13 @@ module Liquid end def evaluate(context = deprecated_default_context) - condition = self - result = nil - loop do - result = interpret_condition(condition.left, condition.right, condition.operator, context) + result = interpret_condition(@left, @right, @operator, context) + # Fast path: no child conditions (most common) + return result unless @child_relation + + condition = self + loop do case condition.child_relation when :or break if Liquid::Utils.to_liquid_value(result) @@ -79,6 +81,7 @@ module Liquid break end condition = condition.child_condition + result = interpret_condition(condition.left, condition.right, condition.operator, context) end result end