io: (mostly) keep fast path when line counting is enabled

This commit is contained in:
Matthew Flatt 2019-02-12 09:50:02 -07:00
parent e3b00715bc
commit c28a0f45dc
6 changed files with 25 additions and 32 deletions

View File

@ -779,6 +779,7 @@
(loop (sub1 j)))))) (loop (sub1 j))))))
(define read-byte-buffer-mode 'block) (define read-byte-buffer-mode 'block)
(define count-lines? #t)
'read-byte/host 'read-byte/host
(time (time
@ -787,7 +788,7 @@
(let () (let ()
(define p (host:open-input-file "compiled/io.rktl")) (define p (host:open-input-file "compiled/io.rktl"))
(host:file-stream-buffer-mode p read-byte-buffer-mode) (host:file-stream-buffer-mode p read-byte-buffer-mode)
(host:port-count-lines! p) (when count-lines? (host:port-count-lines! p))
(let loop () (let loop ()
(unless (eof-object? (host:read-byte p)) (unless (eof-object? (host:read-byte p))
(loop))) (loop)))
@ -801,7 +802,7 @@
(let () (let ()
(define p (open-input-file "compiled/io.rktl")) (define p (open-input-file "compiled/io.rktl"))
(file-stream-buffer-mode p read-byte-buffer-mode) (file-stream-buffer-mode p read-byte-buffer-mode)
(port-count-lines! p) (when count-lines? (port-count-lines! p))
(let loop () (let loop ()
(unless (eof-object? (read-byte p)) (unless (eof-object? (read-byte p))
(loop))) (loop)))

View File

@ -73,14 +73,10 @@
[(i . < . len) [(i . < . len)
(define amt (min (- end start) (fx- len i))) (define amt (min (- end start) (fx- len i)))
(define new-pos (fx+ i amt)) (define new-pos (fx+ i amt))
(cond
[(not count)
;; Keep/resume fast mode ;; Keep/resume fast mode
(set! buffer-pos new-pos) (set! buffer-pos new-pos)
(set! offset 0) (set! offset 0)
(set! buffer bstr)] (set! buffer bstr)
[else
(set! pos new-pos)])
(bytes-copy! dest-bstr start bstr i new-pos) (bytes-copy! dest-bstr start bstr i new-pos)
(progress!) (progress!)
amt] amt]
@ -128,14 +124,10 @@
(let ([amt (min amt (- len i))]) (let ([amt (min amt (- len i))])
(define dest-bstr (make-bytes amt)) (define dest-bstr (make-bytes amt))
(bytes-copy! dest-bstr 0 bstr i (+ i amt)) (bytes-copy! dest-bstr 0 bstr i (+ i amt))
(cond
[(not count)
;; Keep/resume fast mode ;; Keep/resume fast mode
(set! buffer-pos (fx+ i amt)) (set! buffer-pos (fx+ i amt))
(set! buffer bstr) (set! buffer bstr)
(set! offset 0)] (set! offset 0)
[else
(set! pos (fx+ i amt))])
(progress!) (progress!)
(finish dest-bstr)))))] (finish dest-bstr)))))]

View File

@ -87,15 +87,14 @@
;; in atomic mode ;; in atomic mode
[fast-mode! [fast-mode!
(lambda (amt) ; amt = not yet added to `count` (lambda (amt) ; amt = not yet added to `offset`
(unless count
(set! buffer bstr) (set! buffer bstr)
(define s pos) (define s pos)
(set! buffer-pos s) (set! buffer-pos s)
(set! buffer-end end-pos) (set! buffer-end end-pos)
(define o offset) (define o offset)
(when o (when o
(set! offset (- (+ o amt) s)))))] (set! offset (- (+ o amt) s))))]
;; in atomic mode ;; in atomic mode
[slow-mode! [slow-mode!

View File

@ -127,8 +127,8 @@
(private (private
[fast-mode! [fast-mode!
(lambda (amt) ; amt = not yet added to `count` (lambda (amt) ; amt = not yet added to `offset`
(unless (or count buffer) (unless buffer
(with-object pipe-data d (with-object pipe-data d
(define s start) (define s start)
(define e end) (define e end)

View File

@ -29,9 +29,6 @@
;; ;;
;; A non-#f `buffer` further implies that `buffer-pos` should be ;; A non-#f `buffer` further implies that `buffer-pos` should be
;; added to `offset` to get the true offset. ;; added to `offset` to get the true offset.
;;
;; Shortcut mode must be disabled when line counting is enabled,
;; since shortcut mode skips explicit count.
[buffer #f] [buffer #f]
[buffer-pos 0] ; if < `buffer-end`, allows direct read/write on `buffer` [buffer-pos 0] ; if < `buffer-end`, allows direct read/write on `buffer`
[buffer-end 0] [buffer-end 0]

View File

@ -67,6 +67,8 @@
(define new-pos (fx+ buf-pos v)) (define new-pos (fx+ buf-pos v))
(bytes-copy! bstr start (core-port-buffer in) buf-pos new-pos) (bytes-copy! bstr start (core-port-buffer in) buf-pos new-pos)
(set-core-port-buffer-pos! in new-pos) (set-core-port-buffer-pos! in new-pos)
(when (core-port-count in)
(port-count! in v bstr start))
(end-atomic) (end-atomic)
v] v]
[else [else
@ -208,6 +210,8 @@
[(pos . fx< . (core-port-buffer-end in)) [(pos . fx< . (core-port-buffer-end in))
(define b (bytes-ref (core-port-buffer in) pos)) (define b (bytes-ref (core-port-buffer in) pos))
(set-core-port-buffer-pos! in (fx+ pos 1)) (set-core-port-buffer-pos! in (fx+ pos 1))
(when (core-port-count in)
(port-count-byte! in b))
(end-atomic) (end-atomic)
b] b]
[else [else