这里app_id进行匹配和之前的service匹配,为啥要循环匹配,这不是O(N)复杂度了吗

来源:11-3 构建JWT的token生成接口 - 生成token1

weibo_隱懓_0

2021-04-11

为啥不用hash匹配 能O(1)啊

写回答

3回答

牛儿吃草

2021-04-15

数量少的情况,golang使用slice要比map效率更高的。

0
2
weibo_隱懓_0
不对啊,老师我压测结果map要比slice快, package mypkg import ( "strconv" ) func GenMap() map[string]string { map1 := make(map[string]string) for i := 0; i < 10; i++ { map1["key"+strconv.Itoa(i)] = "value" + strconv.Itoa(i) } return map1 } func GenSlice() []string { slice1 := make([]string, 100) for i := 0; i < 10; i++ { slice1 = append(slice1, "value"+strconv.Itoa(i)) } return slice1 } func ReadFromMap(map1 map[string]string) bool { //for k, _ := range map1 { // if k == "key80" { // return true //fmt.Println(map1["key80"]) // } //} if _, exist := map1["key8"]; exist { return true } return false } func ReadFromSlice(slice1 []string) bool { for _, v := range slice1 { if v == "value8" { return true //fmt.Println(slice1[k]) } } return false } package mypkg import "testing" func BenchmarkReadFromMap(b *testing.B) { map1 := GenMap() for i := 0; i < b.N; i++ { ReadFromMap(map1) } } func BenchmarkReadFromSlice(b *testing.B) { slice1 := GenSlice() for i := 0; i < b.N; i++ { ReadFromSlice(slice1) } } 压测结果: BenchmarkReadFromMap-8 47380273 23.4 ns/op BenchmarkReadFromSlice-8 14016381 84.7 ns/op
2021-04-18
共2条回复

牛儿吃草

2021-04-18

【golang中map和slice的查询速度比较,结果意想不到_jeffrey11223的博客-CSDN博客】https://blog.csdn.net/jeffrey11223/article/details/78450938?utm_medium=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.wap_blog_relevant_pic&dist_request_id=&depth_1-utm_source=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.wap_blog_relevant_pic

你在slice上开辟了100个对象空间。应该是10个

1
1
weibo_隱懓_0
谢谢老师
2021-04-18
共1条回复

weibo_隱懓_0

提问者

2021-04-18

package mypkg

import (
  "strconv"
)

func GenMap() map[string]string {
  map1 := make(map[string]string)
  for i := 0; i < 10; i++ {
     map1["key"+strconv.Itoa(i)] = "value" + strconv.Itoa(i)
  }
  return map1
}

func GenSlice() []string {
  slice1 := make([]string, 100)
  for i := 0; i < 10; i++ {
     slice1 = append(slice1, "value"+strconv.Itoa(i))
  }
  return slice1
}
func ReadFromMap(map1 map[string]string) bool {
  //for k, _ := range map1 {
  // if k == "key80" {
  //    return true
  //fmt.Println(map1["key80"])
  // }
  //}
  if _, exist := map1["key8"]; exist {
     return true
  }
  return false
}

func ReadFromSlice(slice1 []string) bool {
  for _, v := range slice1 {
     if v == "value8" {
        return true
        //fmt.Println(slice1[k])
     }
  }
  return false
}


test:


package mypkg

import "testing"

func BenchmarkReadFromMap(b *testing.B) {
  map1 := GenMap()
  for i := 0; i < b.N; i++ {
     ReadFromMap(map1)
  }
}

func BenchmarkReadFromSlice(b *testing.B) {
  slice1 := GenSlice()
  for i := 0; i < b.N; i++ {
     ReadFromSlice(slice1)
  }
}


结果:

BenchmarkReadFromMap-8      47380273         23.4 ns/op

BenchmarkReadFromSlice-8    14016381         84.7 ns/op


比较map是O(1),而且app信息初始化的时候不是map slice各保存一份了吗,从token获取app_id,就能直接map[app_id]取内容了,没必要循环了。

service那个得循环,因为并不知道servicename


0
0

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1317 学习 · 352 问题

查看课程