From 952171f61b8dfaf89a2bbf0083fb7e79231e9f13 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 10 Jul 2017 12:54:13 +0300 Subject: [PATCH] Issue #278: optimize normalizeHeaderKey a bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Performance results on amd64: name old time/op new time/op delta NormalizeHeaderKeyCommonCase-4 43.3ns ± 0% 32.6ns ± 1% -24.80% (p=0.000 n=9+10) NormalizeHeaderKeyLowercase-4 42.6ns ± 3% 32.6ns ± 1% -23.41% (p=0.000 n=10+10) NormalizeHeaderKeyUppercase-4 43.5ns ± 1% 32.6ns ± 2% -25.03% (p=0.000 n=9+8) Based on top of https://github.com/valyala/fasthttp/pull/279 . --- bytesconv.go | 32 ++++++++++++++++++++++++-------- header.go | 21 +++++++++++---------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/bytesconv.go b/bytesconv.go index 5593033..eb4248a 100644 --- a/bytesconv.go +++ b/bytesconv.go @@ -343,18 +343,34 @@ func hexbyte2int(c byte) int { const toLower = 'a' - 'A' -func uppercaseByte(p *byte) { - c := *p - if c >= 'a' && c <= 'z' { - *p = c - toLower +var toLowerTable = func() [256]byte { + var a [256]byte + for i := 0; i < 256; i++ { + c := byte(i) + if c >= 'A' && c <= 'Z' { + a[i] = toLower + } } + return a +}() + +var toUpperTable = func() [256]byte { + var a [256]byte + for i := 0; i < 256; i++ { + c := byte(i) + if c >= 'a' && c <= 'z' { + a[i] = 256 - toLower + } + } + return a +}() + +func uppercaseByte(p *byte) { + *p += toUpperTable[*p] } func lowercaseByte(p *byte) { - c := *p - if c >= 'A' && c <= 'Z' { - *p = c + toLower - } + *p += toLowerTable[*p] } func lowercaseBytes(b []byte) { diff --git a/header.go b/header.go index 00119bc..60b5fd8 100644 --- a/header.go +++ b/header.go @@ -2014,19 +2014,20 @@ func normalizeHeaderKey(b []byte, disableNormalizing bool) { } n := len(b) - up := true - for i := 0; i < n; i++ { - switch b[i] { - case '-': - up = true - default: - if up { - up = false + if n == 0 { + return + } + + uppercaseByte(&b[0]) + for i := 1; i < n; i++ { + if b[i] == '-' { + i++ + if i < n { uppercaseByte(&b[i]) - } else { - lowercaseByte(&b[i]) } + continue } + lowercaseByte(&b[i]) } }