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 | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
2cec92909fddd24feaed596e3bc146c7 |
User & Date: | spaskalev on 2014-12-24 23:58:32 |
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 } |