Overview
| Comment: | 0dev.org/ioutil/SizedReader is now as fast as bufio.Reader if not faster for a buffer of 4096 bytes. Switched pdc to use it for decompression buffering and removed profiling code from the former |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
2cec92909fddd24feaed596e3bc146c7 |
| User & Date: | spaskalev on 2014-12-24 23:58:32.639 |
| Other Links: | manifest | tags |
Context
|
2014-12-25
| ||
| 00:26 | Extracted SizedWriter to a sizedWriter struct with a Write() method. check-in: 46da7a6ae9 user: spaskalev tags: trunk | |
|
2014-12-24
| ||
| 23:58 | 0dev.org/ioutil/SizedReader is now as fast as bufio.Reader if not faster for a buffer of 4096 bytes. Switched pdc to use it for decompression buffering and removed profiling code from the former check-in: 2cec92909f user: spaskalev tags: trunk | |
| 23:45 | Extracted SizedReader to a sizedReader type with a Read() method. Closures seem to be slower in Go 1.4 and there is no real need for SizedReader to be a closure. check-in: b703c38e0b user: spaskalev tags: trunk | |
Changes
Modified src/0dev.org/commands/pdc/main.go
from [675059111f]
to [dfe0b7b6cf].
1 2 3 | package main import ( | < < < < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package main
import (
iou "0dev.org/ioutil"
predictor "0dev.org/predictor"
"fmt"
"io"
"os"
)
func main() {
var code int
switch {
case len(os.Args) == 1:
code = compress(os.Stdout, os.Stdin)
case len(os.Args) == 2 && os.Args[1] == "-d":
code = decompress(os.Stdout, os.Stdin)
default:
fmt.Fprintln(os.Stdout, "Usage: pdc [-d]")
}
os.Exit(code)
}
// Compress the data from the given io.Reader and write it to the given io.Writer
// I/O is buffered for better performance
func compress(output io.Writer, input io.Reader) int {
var (
|
| ︙ | ︙ | |||
61 62 63 64 65 66 67 |
// Decompress the data from the given io.Reader and write it to the given io.Writer
// I/O is buffered for better performance
func decompress(output io.Writer, input io.Reader) int {
var (
err error
buffer io.Writer = iou.SizedWriter(output, 4096)
decompressor io.Reader = predictor.Decompressor(iou.SizedReader(input, 4096))
| < | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
// Decompress the data from the given io.Reader and write it to the given io.Writer
// I/O is buffered for better performance
func decompress(output io.Writer, input io.Reader) int {
var (
err error
buffer io.Writer = iou.SizedWriter(output, 4096)
decompressor io.Reader = predictor.Decompressor(iou.SizedReader(input, 4096))
)
_, err = io.Copy(buffer, decompressor)
if err != nil {
fmt.Fprintln(os.Stderr, "Error while decompressing.\n", err)
return 1
}
|
| ︙ | ︙ |
Modified src/0dev.org/ioutil/ioutil.go
from [c84493a1fe]
to [9862ea3396].
| ︙ | ︙ | |||
103 104 105 106 107 108 109 | var ( count int err error ) start: // Reply with the buffered data if there is any | | | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
var (
count int
err error
)
start:
// Reply with the buffered data if there is any
if sr.to > 0 {
count = copy(output, sr.buffer[sr.from:sr.to])
// Advance the data in the buffer
sr.from += count
// Check whether we have reached the end of the buffer
if sr.from == sr.to {
// Reset the buffer
sr.from, sr.to = 0, 0
return count, err
}
// Do not propagate an error until the buffer is exhausted
|
| ︙ | ︙ | |||
132 133 134 135 136 137 138 | // Perform a read into the buffer count, err = sr.reader.Read(sr.buffer) // Size the buffer down to the read data size // and restart if we have successfully read some bytes sr.from, sr.to = 0, count | | | 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
// Perform a read into the buffer
count, err = sr.reader.Read(sr.buffer)
// Size the buffer down to the read data size
// and restart if we have successfully read some bytes
sr.from, sr.to = 0, count
if sr.to > 0 {
goto start
}
// Returning on err/misbehaving noop reader
return 0, err
}
|