diff options
author | Aliaksandr Valialkin <valyala@gmail.com> | 2015-12-11 16:40:55 +0200 |
---|---|---|
committer | Aliaksandr Valialkin <valyala@gmail.com> | 2015-12-11 16:40:55 +0200 |
commit | b00a213a93e308d9e649777a2fea323f4b0b4796 (patch) | |
tree | 686321705181dd9f253b3072b655ab1fec905c43 /userdata.go | |
parent | Added AppendIPv4 and ParseIPv4 helper functions (diff) | |
download | fasthttp-b00a213a93e308d9e649777a2fea323f4b0b4796.tar.gz fasthttp-b00a213a93e308d9e649777a2fea323f4b0b4796.tar.bz2 fasthttp-b00a213a93e308d9e649777a2fea323f4b0b4796.zip |
Moved ctx.UserValue from standard map to custom userData. This should improve its' performance for common case when ctx contains up to 10 user values
Diffstat (limited to 'userdata.go')
-rw-r--r-- | userdata.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/userdata.go b/userdata.go new file mode 100644 index 0000000..ecc343e --- /dev/null +++ b/userdata.go @@ -0,0 +1,59 @@ +package fasthttp + +type userDataKV struct { + key []byte + value interface{} +} + +type userData []userDataKV + +func (d *userData) Set(key string, value interface{}) { + args := *d + n := len(args) + for i := 0; i < n; i++ { + kv := &args[i] + if string(kv.key) == key { + kv.value = value + return + } + } + + c := cap(args) + if c > n { + args = args[:n+1] + kv := &args[n] + kv.key = append(kv.key[:0], key...) + kv.value = value + *d = args + return + } + + kv := userDataKV{} + kv.key = append(kv.key[:0], key...) + kv.value = value + *d = append(args, kv) +} + +func (d *userData) SetBytes(key []byte, value interface{}) { + d.Set(unsafeBytesToStr(key), value) +} + +func (d *userData) Get(key string) interface{} { + args := *d + n := len(args) + for i := 0; i < n; i++ { + kv := &args[i] + if string(kv.key) == key { + return kv.value + } + } + return nil +} + +func (d *userData) GetBytes(key []byte) interface{} { + return d.Get(unsafeBytesToStr(key)) +} + +func (d *userData) Reset() { + *d = (*d)[:0] +} |