Tuning buffer sizes
Overview
When the typical read/write size is small, using a buffer can make a significant improvement in performance. However when reading/writing large amounts of data, additional buffered doesn't help and can add a small amount of overhead.
Additionally, it can be tempting to assume; the larger the buffer the better. However is appears a more modest buffer size, around the size of your L1 cache could be better. e.g 8 KB to 32 KB.
The test
In the following test I compared using buffered and unbuffered reads and writes to a temporary file on a tmpfs filesystem (ram disk)
| Size of read/write  | Unbuffered Writes  |   Buffered Writes  | Unbuffered Reads  |   Buffered Reads  | 
|---|---|---|---|---|
| 1 | 2 MB/s | 86 MB/s | 3 MB/s | 72 MB/s | 
| 2 | 4 MB/s | 165 MB/s | 6 MB/s | 147 MB/s | 
| 4 | 8 MB/s | 333 MB/s | 11 MB/s | 291 MB/s | 
| 8 | 17 MB/s | 578 MB/s | 24 MB/s | 560 MB/s | 
| 16 | 34 MB/s | 920 MB/s | 49 MB/s | 983 MB/s | 
| 32 | 67 MB/s | 1,345 MB/s | 99 MB/s | 1,679 MB/s | 
| 64 | 133 MB/s | 1,746 MB/s | 198 MB/s | 2,518 MB/s | 
| 128 | 254 MB/s | 2,024 MB/s | 391 MB/s | 3,387 MB/s | 
| 256 | 463 MB/s | 2,172 MB/s | 742 MB/s | 4,104 MB/s | 
| 512 | 798 MB/s | 2,270 MB/s | 1,334 MB/s | 4,549 MB/s | 
| 1,024 | 1,270 MB/s | 2,299 MB/s | 2,355 MB/s | 4,752 MB/s | 
| 2,048 | 1,789 MB/s | 2,310 MB/s | 3,704 MB/s | 4,923 MB/s | 
| 4,096 | 2,287 MB/s | 2,301 MB/s | 5,324 MB/s | 4,859 MB/s | 
| 8,192 | 2,589 MB/s | 2,497 MB/s | 6,346 MB/s | 6,142 MB/s | 
| 16,384 | 2,534 MB/s | 2,559 MB/s | 5,764 MB/s | 5,697 MB/s | 
| 32,768 | 2,591 MB/s | 2,561 MB/s | 5,793 MB/s | 5,723 MB/s | 
| 65,536 | 2,613 MB/s | 2,581 MB/s | 5,861 MB/s | 5,883 MB/s | 
| 131,072 | 2,580 MB/s | 2,581 MB/s | 5,401 MB/s | 5,405 MB/s | 
| 262,144 | 1,918 MB/s | 1,907 MB/s | 3,269 MB/s | 3,262 MB/s | 
| 524,288 | 1,749 MB/s | 1,734 MB/s | 2,845 MB/s | 2,851 MB/s | 
| 1,048,576 | 1,471 MB/s | 1,469 MB/s | 2,501 MB/s | 2,502 MB/s | 
The default size of a BufferedInputStream and BufferedOutputStream is 8KB. This is part of the reason why they don't help at this point and larger.
The code
BufferTest.java
Comments
Post a Comment