]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: tune append crossover on amd64 and 386
authorDave Cheney <dave@cheney.net>
Mon, 5 Aug 2013 21:51:37 +0000 (07:51 +1000)
committerDave Cheney <dave@cheney.net>
Mon, 5 Aug 2013 21:51:37 +0000 (07:51 +1000)
Fixes #4963.

Sets the append crossover to 0 on intel platforms.

Results for linux/amd64 Core i5 SNB

benchmark                     old ns/op    new ns/op    delta
BenchmarkAppend                     102          104   +1.96%
BenchmarkAppend1Byte                 10           11   +0.92%
BenchmarkAppend4Bytes                15           11  -28.10%
BenchmarkAppend7Bytes                17           12  -32.58%
BenchmarkAppend8Bytes                18           12  -36.17%
BenchmarkAppend15Bytes               24           11  -55.02%
BenchmarkAppend16Bytes               25           11  -56.03%
BenchmarkAppend32Bytes               11           12   +4.31%
BenchmarkAppendStr1Byte               8            9  +13.99%
BenchmarkAppendStr4Bytes             11            9  -17.52%
BenchmarkAppendStr8Bytes             14            9  -35.70%
BenchmarkAppendStr16Bytes            21            9  -55.19%
BenchmarkAppendStr32Bytes            10           10   -5.66%
BenchmarkAppendSpecialCase           49           52   +7.96%

Results for linux/386 Atom(TM) CPU 330 @ 1.60GHz

benchmark                     old ns/op    new ns/op    delta
BenchmarkAppend                     219          218   -0.46%
BenchmarkAppend1Byte                 75           72   -3.44%
BenchmarkAppend4Bytes                92           73  -19.87%
BenchmarkAppend7Bytes               108           74  -31.20%
BenchmarkAppend8Bytes               116           74  -35.95%
BenchmarkAppend15Bytes              162           77  -52.22%
BenchmarkAppend16Bytes              169           77  -54.20%
BenchmarkAppend32Bytes               88           86   -2.38%
BenchmarkAppendStr1Byte              57           59   +3.32%
BenchmarkAppendStr4Bytes             72           59  -17.40%
BenchmarkAppendStr8Bytes             92           60  -34.70%
BenchmarkAppendStr16Bytes           141           63  -54.89%
BenchmarkAppendStr32Bytes            75           73   -2.64%
BenchmarkAppendSpecialCase          270          270   +0.00%

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12440044

src/pkg/runtime/append_test.go
src/pkg/runtime/arch_386.h
src/pkg/runtime/arch_amd64.h
src/pkg/runtime/slice.c

index 36390181e87fa5658c442e10c361d15d4bc97589..8a4e4a383d366c3e74ec3b0e2b40ba0fad264446 100644 (file)
@@ -38,10 +38,18 @@ func BenchmarkAppend4Bytes(b *testing.B) {
        benchmarkAppendBytes(b, 4)
 }
 
+func BenchmarkAppend7Bytes(b *testing.B) {
+       benchmarkAppendBytes(b, 7)
+}
+
 func BenchmarkAppend8Bytes(b *testing.B) {
        benchmarkAppendBytes(b, 8)
 }
 
+func BenchmarkAppend15Bytes(b *testing.B) {
+       benchmarkAppendBytes(b, 15)
+}
+
 func BenchmarkAppend16Bytes(b *testing.B) {
        benchmarkAppendBytes(b, 16)
 }
index 7e74d8f923b642dd79b8031eb38faa41068db6a6..6c8550d61d7d586bed3847181ec6a5b959f84fd8 100644 (file)
@@ -6,6 +6,6 @@ enum {
        thechar = '8',
        BigEndian = 0,
        CacheLineSize = 64,
-       appendCrossover = 16,
+       appendCrossover = 0,
        PCQuantum = 1
 };
index 21144111b218b28aaceed8cfbee6e611ef544ab3..761183a9d3364d73f0eebcf037c9439e9a6f398b 100644 (file)
@@ -6,6 +6,6 @@ enum {
        thechar = '6',
        BigEndian = 0,
        CacheLineSize = 64,
-       appendCrossover = 16,
+       appendCrossover = 0,
        PCQuantum = 1
 };
index 3adbe51837b5401dd8385a7ea7ddd73f43f48a0f..58086b61c7eda37191fa6f69f19ff65dd3d3cc9c 100644 (file)
@@ -95,7 +95,7 @@ runtimeĀ·appendslice(SliceType *t, Slice x, Slice y, Slice ret)
        p = ret.array+ret.len*w;
        q = y.array;
        w *= y.len;
-       if(w <= appendCrossover) {
+       if(appendCrossover > 0 && w <= appendCrossover) {
                if(p <= q || w <= p-q) // No overlap.
                        while(w-- > 0)
                                *p++ = *q++;
@@ -148,7 +148,7 @@ runtimeĀ·appendstr(SliceType *t, Slice x, String y, Slice ret)
        w = y.len;
        p = ret.array+ret.len;
        q = y.str;
-       if(w <= appendCrossover) {
+       if(appendCrossover > 0 && w <= appendCrossover) {
                while(w-- > 0)
                        *p++ = *q++;
        } else {