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.db4
parent
bab801b321
commit
f31fb8a968
|
@ -119,9 +119,13 @@ SYMBOL: error-stream
|
||||||
: (new-sequence-for-stream) ( n stream -- seq )
|
: (new-sequence-for-stream) ( n stream -- seq )
|
||||||
stream-exemplar new-sequence ; inline
|
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 )
|
: (read-into-new) ( n stream quot -- seq/f )
|
||||||
|
[ dup ] 2dip
|
||||||
[ 2dup (new-sequence-for-stream) swap ] dip curry keep
|
[ 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 )
|
: (read-into) ( buf stream quot -- buf-slice/f )
|
||||||
[ dup length over ] 2dip call
|
[ dup length over ] 2dip call
|
||||||
|
|
Loading…
Reference in New Issue