aboutsummaryrefslogtreecommitdiff
path: root/userdata.go
diff options
context:
space:
mode:
authorGravatar Aliaksandr Valialkin <valyala@gmail.com> 2015-12-11 16:40:55 +0200
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2015-12-11 16:40:55 +0200
commitb00a213a93e308d9e649777a2fea323f4b0b4796 (patch)
tree686321705181dd9f253b3072b655ab1fec905c43 /userdata.go
parentAdded AppendIPv4 and ParseIPv4 helper functions (diff)
downloadfasthttp-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.go59
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]
+}