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))))))
|
||||
|
||||
(define read-byte-buffer-mode 'block)
|
||||
(define count-lines? #t)
|
||||
|
||||
'read-byte/host
|
||||
(time
|
||||
|
@ -787,7 +788,7 @@
|
|||
(let ()
|
||||
(define p (host:open-input-file "compiled/io.rktl"))
|
||||
(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 ()
|
||||
(unless (eof-object? (host:read-byte p))
|
||||
(loop)))
|
||||
|
@ -801,7 +802,7 @@
|
|||
(let ()
|
||||
(define p (open-input-file "compiled/io.rktl"))
|
||||
(file-stream-buffer-mode p read-byte-buffer-mode)
|
||||
(port-count-lines! p)
|
||||
(when count-lines? (port-count-lines! p))
|
||||
(let loop ()
|
||||
(unless (eof-object? (read-byte p))
|
||||
(loop)))
|
||||
|
|
|
@ -73,14 +73,10 @@
|
|||
[(i . < . len)
|
||||
(define amt (min (- end start) (fx- len i)))
|
||||
(define new-pos (fx+ i amt))
|
||||
(cond
|
||||
[(not count)
|
||||
;; Keep/resume fast mode
|
||||
(set! buffer-pos new-pos)
|
||||
(set! offset 0)
|
||||
(set! buffer bstr)]
|
||||
[else
|
||||
(set! pos new-pos)])
|
||||
;; Keep/resume fast mode
|
||||
(set! buffer-pos new-pos)
|
||||
(set! offset 0)
|
||||
(set! buffer bstr)
|
||||
(bytes-copy! dest-bstr start bstr i new-pos)
|
||||
(progress!)
|
||||
amt]
|
||||
|
@ -128,14 +124,10 @@
|
|||
(let ([amt (min amt (- len i))])
|
||||
(define dest-bstr (make-bytes amt))
|
||||
(bytes-copy! dest-bstr 0 bstr i (+ i amt))
|
||||
(cond
|
||||
[(not count)
|
||||
;; Keep/resume fast mode
|
||||
(set! buffer-pos (fx+ i amt))
|
||||
(set! buffer bstr)
|
||||
(set! offset 0)]
|
||||
[else
|
||||
(set! pos (fx+ i amt))])
|
||||
;; Keep/resume fast mode
|
||||
(set! buffer-pos (fx+ i amt))
|
||||
(set! buffer bstr)
|
||||
(set! offset 0)
|
||||
(progress!)
|
||||
(finish dest-bstr)))))]
|
||||
|
||||
|
|
|
@ -87,15 +87,14 @@
|
|||
|
||||
;; in atomic mode
|
||||
[fast-mode!
|
||||
(lambda (amt) ; amt = not yet added to `count`
|
||||
(unless count
|
||||
(set! buffer bstr)
|
||||
(define s pos)
|
||||
(set! buffer-pos s)
|
||||
(set! buffer-end end-pos)
|
||||
(define o offset)
|
||||
(when o
|
||||
(set! offset (- (+ o amt) s)))))]
|
||||
(lambda (amt) ; amt = not yet added to `offset`
|
||||
(set! buffer bstr)
|
||||
(define s pos)
|
||||
(set! buffer-pos s)
|
||||
(set! buffer-end end-pos)
|
||||
(define o offset)
|
||||
(when o
|
||||
(set! offset (- (+ o amt) s))))]
|
||||
|
||||
;; in atomic mode
|
||||
[slow-mode!
|
||||
|
|
|
@ -127,8 +127,8 @@
|
|||
|
||||
(private
|
||||
[fast-mode!
|
||||
(lambda (amt) ; amt = not yet added to `count`
|
||||
(unless (or count buffer)
|
||||
(lambda (amt) ; amt = not yet added to `offset`
|
||||
(unless buffer
|
||||
(with-object pipe-data d
|
||||
(define s start)
|
||||
(define e end)
|
||||
|
|
|
@ -29,9 +29,6 @@
|
|||
;;
|
||||
;; A non-#f `buffer` further implies that `buffer-pos` should be
|
||||
;; 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-pos 0] ; if < `buffer-end`, allows direct read/write on `buffer`
|
||||
[buffer-end 0]
|
||||
|
|
|
@ -67,6 +67,8 @@
|
|||
(define new-pos (fx+ buf-pos v))
|
||||
(bytes-copy! bstr start (core-port-buffer in) buf-pos new-pos)
|
||||
(set-core-port-buffer-pos! in new-pos)
|
||||
(when (core-port-count in)
|
||||
(port-count! in v bstr start))
|
||||
(end-atomic)
|
||||
v]
|
||||
[else
|
||||
|
@ -208,6 +210,8 @@
|
|||
[(pos . fx< . (core-port-buffer-end in))
|
||||
(define b (bytes-ref (core-port-buffer in) pos))
|
||||
(set-core-port-buffer-pos! in (fx+ pos 1))
|
||||
(when (core-port-count in)
|
||||
(port-count-byte! in b))
|
||||
(end-atomic)
|
||||
b]
|
||||
[else
|
||||
|
|
Loading…
Reference in New Issue
Block a user