From 1de810f416f260afd68df03120b5c072623890ef Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 9 Nov 2011 14:29:12 -0800 Subject: [PATCH] io:read: don't resize output buffer if unnecessary Even with a short-circuit test in the VM primitives, resize still has an overly high runtime cost in tight loops. For #376. --- core/io/io.factor | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/io/io.factor b/core/io/io.factor index 8e74493647..8eb16b7653 100644 --- a/core/io/io.factor +++ b/core/io/io.factor @@ -119,9 +119,13 @@ SYMBOL: error-stream : (new-sequence-for-stream) ( n stream -- seq ) stream-exemplar new-sequence ; inline +: resize-if-necessary ( wanted-n got-n seq -- seq' ) + 2over = [ [ 2drop ] dip ] [ resize nip ] if ; inline + : (read-into-new) ( n stream quot -- seq/f ) + [ dup ] 2dip [ 2dup (new-sequence-for-stream) swap ] dip curry keep - over 0 = [ 2drop f ] [ resize ] if ; inline + over 0 = [ 3drop f ] [ resize-if-necessary ] if ; inline : (read-into) ( buf stream quot -- buf-slice/f ) [ dup length over ] 2dip call