From a5bebbe77317d583dbf45909cc11f599c93c2065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorben=20Kr=C3=BCger?= Date: Mon, 21 Jul 2025 16:43:39 +0200 Subject: [PATCH] WhereSequence: improve iteration performance by caching value lookup in iterate() call --- src/vm/wren_core.wren | 13 +++++++++++-- src/vm/wren_core.wren.inc | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/vm/wren_core.wren b/src/vm/wren_core.wren index f073062c2..4d10c7526 100644 --- a/src/vm/wren_core.wren +++ b/src/vm/wren_core.wren @@ -169,16 +169,25 @@ class WhereSequence is Sequence { construct new(sequence, fn) { _sequence = sequence _fn = fn + _cache_val = null + _cache_iter = null } iterate(iterator) { while (iterator = _sequence.iterate(iterator)) { - if (_fn.call(_sequence.iteratorValue(iterator))) break + var val = _sequence.iteratorValue(iterator) + if (_fn.call(val)) { + _cache_val = val + _cache_iter = iterator + break + } } return iterator } - iteratorValue(iterator) { _sequence.iteratorValue(iterator) } + iteratorValue(iterator) { + if (iterator == _cache_iter) return _cache_val else return _sequence.iteratorValue(iterator) + } } class String is Sequence { diff --git a/src/vm/wren_core.wren.inc b/src/vm/wren_core.wren.inc index be296cdf7..c928fe929 100644 --- a/src/vm/wren_core.wren.inc +++ b/src/vm/wren_core.wren.inc @@ -171,16 +171,25 @@ static const char* coreModuleSource = " construct new(sequence, fn) {\n" " _sequence = sequence\n" " _fn = fn\n" +" _cache_val = null\n" +" _cache_iter = null\n" " }\n" "\n" " iterate(iterator) {\n" " while (iterator = _sequence.iterate(iterator)) {\n" -" if (_fn.call(_sequence.iteratorValue(iterator))) break\n" +" var val = _sequence.iteratorValue(iterator)\n" +" if (_fn.call(val)) {\n" +" _cache_val = val\n" +" _cache_iter = iterator\n" +" break\n" +" }\n" " }\n" " return iterator\n" " }\n" "\n" -" iteratorValue(iterator) { _sequence.iteratorValue(iterator) }\n" +" iteratorValue(iterator) {\n" +" if (iterator == _cache_iter) return _cache_val else return _sequence.iteratorValue(iterator)\n" +" }\n" "}\n" "\n" "class String is Sequence {\n"