Skip to content
This repository has been archived by the owner on Jan 27, 2022. It is now read-only.

Improve performance by using append to populate and grow buffer #2

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

rykov
Copy link

@rykov rykov commented Nov 24, 2017

Following up on PR #1, I decided to try out different strategies to replace explicit buffer management in the current version of rmarsh Generator. I tried using bytes.Buffer, bufio.Writer, and append and it looks like the latter is the best performing solution.

Here are the original performance numbers for manual buffer management in master:

BenchmarkGenReset-4         	500000000	         3.56 ns/op
BenchmarkGenNil-4           	100000000	        19.3 ns/op
BenchmarkGenBool-4          	100000000	        19.3 ns/op
BenchmarkGenFixnum-4        	100000000	        23.6 ns/op
BenchmarkGenBignum-4        	20000000	        67.1 ns/op
BenchmarkGenSymbol-4        	50000000	        30.5 ns/op
BenchmarkGenString-4        	50000000	        29.2 ns/op
BenchmarkGenFloat-4         	10000000	       222 ns/op
BenchmarkGenArray-4         	30000000	        41.1 ns/op
BenchmarkGenLargeArray-4    	    2000	   1051485 ns/op
BenchmarkGenHash-4          	20000000	        69.2 ns/op
BenchmarkGenClass-4         	50000000	        27.6 ns/op
BenchmarkGenModule-4        	50000000	        26.1 ns/op
BenchmarkGenIVar-4          	20000000	        87.6 ns/op
BenchmarkGenUserDefined-4   	50000000	        41.0 ns/op
BenchmarkGenStruct-4        	20000000	        80.4 ns/op

And here's the improved performance after switching to append:

BenchmarkGenReset-4         	300000000	         4.22 ns/op
BenchmarkGenNil-4           	100000000	        16.7 ns/op
BenchmarkGenBool-4          	100000000	        16.8 ns/op
BenchmarkGenFixnum-4        	100000000	        23.2 ns/op
BenchmarkGenBignum-4        	30000000	        48.9 ns/op
BenchmarkGenSymbol-4        	50000000	        30.7 ns/op
BenchmarkGenString-4        	50000000	        27.5 ns/op
BenchmarkGenFloat-4         	10000000	       220 ns/op
BenchmarkGenArray-4         	50000000	        36.1 ns/op
BenchmarkGenLargeArray-4    	    2000	    988043 ns/op
BenchmarkGenHash-4          	20000000	        63.7 ns/op
BenchmarkGenClass-4         	50000000	        25.2 ns/op
BenchmarkGenModule-4        	50000000	        25.7 ns/op
BenchmarkGenIVar-4          	20000000	        80.8 ns/op
BenchmarkGenUserDefined-4   	50000000	        40.0 ns/op
BenchmarkGenStruct-4        	20000000	        71.8 ns/op

The bytes.Buffer and bufio.Writer branches were much slower, so I didn't pursue those solutions. However, if you'd like to take a look, they are here:
https://github.com/rykov/rmarsh/tree/buf-bytes
https://github.com/rykov/rmarsh/tree/buf-bufio

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant