From bfd119e3b51b0a0f588161304fd331550c892eca Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 6 Nov 2008 00:02:44 -0600 Subject: [PATCH] I/O ricing: various hints added so that UTF8 and ASCII fastpaths compile with less dispatch. 25% improvement on reverse-complement --- .../tree/propagation/inlining/inlining.factor | 2 +- basis/hints/hints.factor | 4 +++- basis/io/buffers/buffers.factor | 13 +++++-------- basis/io/encodings/ascii/ascii.factor | 2 +- basis/io/ports/ports.factor | 4 ++-- core/io/encodings/encodings.factor | 4 ++-- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/basis/compiler/tree/propagation/inlining/inlining.factor b/basis/compiler/tree/propagation/inlining/inlining.factor index 130b94cf6b..8397a5fdbb 100644 --- a/basis/compiler/tree/propagation/inlining/inlining.factor +++ b/basis/compiler/tree/propagation/inlining/inlining.factor @@ -131,7 +131,7 @@ DEFER: (flat-length) ] bi* + + + + + ; : should-inline? ( #call word -- ? ) - inlining-rank 5 >= ; + dup "inline" word-prop [ 2drop t ] [ inlining-rank 5 >= ] if ; SYMBOL: history diff --git a/basis/hints/hints.factor b/basis/hints/hints.factor index a10588d730..06ca209cae 100644 --- a/basis/hints/hints.factor +++ b/basis/hints/hints.factor @@ -64,10 +64,12 @@ IN: hints { first first2 first3 first4 } [ { array } "specializer" set-word-prop ] each -{ peek pop* pop push } [ +{ peek pop* pop } [ { vector } "specializer" set-word-prop ] each +\ push { { vector } { sbuf } } "specializer" set-word-prop + \ push-all { { string sbuf } { array vector } { byte-array byte-vector } } "specializer" set-word-prop diff --git a/basis/io/buffers/buffers.factor b/basis/io/buffers/buffers.factor index e6a0070ee0..4df081b17d 100644 --- a/basis/io/buffers/buffers.factor +++ b/basis/io/buffers/buffers.factor @@ -36,9 +36,7 @@ M: buffer dispose* ptr>> free ; [ ptr>> ] [ pos>> ] bi alien-unsigned-1 ; inline : buffer-pop ( buffer -- byte ) - [ buffer-peek ] [ 1 swap buffer-consume ] bi ; - -HINTS: buffer-pop buffer ; + [ buffer-peek ] [ 1 swap buffer-consume ] bi ; inline : buffer-length ( buffer -- n ) [ fill>> ] [ pos>> ] bi - ; inline @@ -69,14 +67,13 @@ HINTS: n>buffer fixnum buffer ; HINTS: >buffer byte-array buffer ; : byte>buffer ( byte buffer -- ) + [ >fixnum ] dip [ [ ptr>> ] [ fill>> ] bi set-alien-unsigned-1 ] [ 1 swap n>buffer ] - bi ; - -HINTS: byte>buffer fixnum buffer ; + bi ; inline : search-buffer-until ( pos fill ptr separators -- n ) - [ [ swap alien-unsigned-1 ] dip memq? ] 2curry find-from drop ; + [ [ swap alien-unsigned-1 ] dip memq? ] 2curry find-from drop ; inline : finish-buffer-until ( buffer n -- byte-array separator ) [ @@ -86,7 +83,7 @@ HINTS: byte>buffer fixnum buffer ; ] [ [ buffer-length ] keep buffer-read f - ] if* ; + ] if* ; inline : buffer-until ( separators buffer -- byte-array separator ) swap [ { [ ] [ pos>> ] [ fill>> ] [ ptr>> ] } cleave ] dip diff --git a/basis/io/encodings/ascii/ascii.factor b/basis/io/encodings/ascii/ascii.factor index 08dc8d07d9..0803ba3871 100644 --- a/basis/io/encodings/ascii/ascii.factor +++ b/basis/io/encodings/ascii/ascii.factor @@ -9,7 +9,7 @@ IN: io.encodings.ascii : decode-if< ( stream encoding max -- character ) nip swap stream-read1 dup - [ tuck > [ drop replacement-char ] unless ] [ 2drop f ] if ; inline + [ tuck > [ >fixnum ] [ drop replacement-char ] if ] [ 2drop f ] if ; inline PRIVATE> SINGLETON: ascii diff --git a/basis/io/ports/ports.factor b/basis/io/ports/ports.factor index 909b2dcf3b..6ee982fcda 100644 --- a/basis/io/ports/ports.factor +++ b/basis/io/ports/ports.factor @@ -100,7 +100,7 @@ TUPLE: output-port < buffered-port ; : wait-to-write ( len port -- ) tuck buffer>> buffer-capacity <= - [ drop ] [ stream-flush ] if ; + [ drop ] [ stream-flush ] if ; inline M: output-port stream-write1 dup check-disposed @@ -161,4 +161,4 @@ HINTS: decoder-read-until { string input-port utf8 } { string input-port ascii } HINTS: decoder-readln { input-port utf8 } { input-port ascii } ; -HINTS: decoder-write { string output-port utf8 } { string output-port ascii } ; +HINTS: encoder-write { string output-port utf8 } { string output-port ascii } ; diff --git a/core/io/encodings/encodings.factor b/core/io/encodings/encodings.factor index 36cec298bd..48a428d36e 100644 --- a/core/io/encodings/encodings.factor +++ b/core/io/encodings/encodings.factor @@ -124,11 +124,11 @@ M: object encoder boa ; M: encoder stream-write1 >encoder< encode-char ; -: decoder-write ( string stream encoding -- ) +: encoder-write ( string stream encoding -- ) [ encode-char ] 2curry each ; M: encoder stream-write - >encoder< decoder-write ; + >encoder< encoder-write ; M: encoder dispose stream>> dispose ;