请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

正在回答

3回答

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

0 回复 有任何疑惑可以回复我~
  • 提问者 weibo_隱懓_0 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-04-18 11:58:08
  • 提问者 weibo_隱懓_0 #2
    不对啊,老师我压测结果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 15:23:52
牛儿吃草 2021-04-18 18:34:17

【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 回复 有任何疑惑可以回复我~
提问者 weibo_隱懓_0 2021-04-18 15:33:30

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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信