io: (mostly) keep fast path when line counting is enabled
This commit is contained in:
parent
e3b00715bc
commit
c28a0f45dc
|
@ -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)))
|
||||||
|
|
|
@ -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)))))]
|
||||||
|
|
||||||
|
|
|
@ -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!
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user