From 408238e20bb794d91199c892c68a0989fc924d65 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 3 Oct 2013 09:19:10 -0400 Subject: [PATCH] runtime: change default stack segment size to 8 kB Changing from 4 kB to 8 kB brings significant improvement on a variety of the Go 1 benchmarks, on both amd64 and 386 systems. Significant runtime reductions: amd64 386 GoParse -14% -1% GobDecode -12% -20% GobEncode -64% -1% JSONDecode -9% -4% JSONEncode -15% -5% Template -17% -14% In the longer term, khr's new stacks will avoid needing to make this decision at all, but for Go 1.2 this is a reasonable stopgap that makes performance significantly better. Demand paging should mean that if the second 4 kB is not used, it will not be brought into memory, so the change should not adversely affect resident set size. The same argument could justify bumping as high as 64 kB on 64-bit machines, but there are diminishing returns after 8 kB, and using 8 kB limits the possible unintended memory overheads we are not aware of. Benchmark graphs at http://swtch.com/~rsc/gostackamd64.html http://swtch.com/~rsc/gostack386.html Full data at http://swtch.com/~rsc/gostack.zip R=golang-dev, khr, dave, bradfitz, dvyukov CC=golang-dev https://golang.org/cl/14317043 --- src/pkg/runtime/stack.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pkg/runtime/stack.h b/src/pkg/runtime/stack.h index 2784a8620f..296eb688de 100644 --- a/src/pkg/runtime/stack.h +++ b/src/pkg/runtime/stack.h @@ -71,12 +71,12 @@ enum { // The amount of extra stack to allocate beyond the size // needed for the single frame that triggered the split. - StackExtra = 1024, + StackExtra = 2048, // The minimum stack segment size to allocate. // If the amount needed for the splitting frame + StackExtra // is less than this number, the stack will have this size instead. - StackMin = 4096, + StackMin = 8192, FixedStack = StackMin + StackSystem, // Functions that need frames bigger than this use an extra -- 2.50.0