V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lesismal  ›  全部回复第 57 页 / 共 63 页
回复总数  1248
1 ... 49  50  51  52  53  54  55  56  57  58 ... 63  
2021-04-07 11:37:02 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@makdon
原来 63 楼已经回复过了,66 楼多余了,缘分
2021-04-07 11:34:51 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@Lpl 恩恩,这种简单功能都不会性能瓶颈,主要还要考虑设计上的复杂度,chan 不是万能灵药,毕竟加了一层 chan,同步逻辑变成了异步逻辑,换成 chan 的实现也不比 mutex 来得简洁,并且也不如用 mutex 容易理解

锁是很基础的设施,不要怕用它
2021-04-07 11:27:08 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@GTim 不用以后深入研究,就今天吧

不能怪 fiber,fiber 是基于 fasthttp 的,以前看过 fasthttp 相关介绍大概意思是 fasthttp 为了性能,很多地方 pool 复用内存,虽然我没有读 fasthttp 源码,只是大概分析,但是大致原因应该是差不多的:

应用层获取 http 各种参数时是复用的[]byte unsafe 的方式强转成 string,类似 c/c++的浅拷贝,新的 string 和原来的[]byte 类型结构体的数据指针指向同一段内存,而在本次 handler 调用结束后,这段[]byte 就被放回了 pool 并且以后有新的地方使用时又被拿出来
比如楼主的 key 加入到 map 时字面值是 "a",按照 "a" 的 hash index 存到对应的 map 的 bucket 里,而这个 string "a" 的结构体内部指向的内存被放回 pool,其他地方再次从 pool get 到时就可能被复用的地方修改,比如刚好其他请求的这个 key 复用了 "a" 的同一段内存但是这些请求的 key 为"b","b" 加到 map 里的时候是按照 "b" 的 hash index 存到对应的 bucket 里的、不同的 hash index 则不碰撞、不会跟原来的那个 string "a"(当前字面值也是"b")比较,所以就产生了多个 key

实在不喜欢 fasthttp
但是 fiber 的接口 /API 设计看着比 gin 舒服,还是挺喜欢的
但是生产项目,我还是不打算用 fasthttp 系的
2021-04-06 21:04:36 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@zkdfbb 最好可以给一份可以复现的代码+测试用例,大家可以复现下看看
2021-04-06 20:09:13 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@Lpl 淡定点,淡定点
1. 每个路由预先存到这个简单的统计里,代码会很漂亮?而且这点计数功能用 mutex 性能也不是瓶颈
2. 照本宣科这个词不是为了贬低,而是想告诉你不要听别人说好就什么都用什么,要懂得从实际出发
3. 先看懂我回复的内容
另外,chan 和 mutex 你可以自己先 benchmark 试试,chan 的源码在 runtime/chan.go 里,本身就带有锁的逻辑,并且跨越了协程,如果你觉得会比 mutex 性能好,那可以试试看
2021-04-06 20:01:51 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@kcojkcnw 对。32 位也一样,pointer 是字长,并且这种非结构体成员变量是对齐的,除了老奔腾还是哪个版本年代之前的,i32 也是原子的
2021-04-06 19:07:14 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@Orlion 对,这份代码里问题最大的就这句,accessLog 原来的内存被赋为新值的过程不原子,所以可能 panic 、还可能 Incr 的 Lock 是原来的 Mux 、Unlock 是新的 Mux 所以死锁

我还是建议我 25 楼说的那样都改成 accessLog = &Counter{data: make(map[string]int)}
2021-04-06 19:03:45 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@makdon 过奖了,3q
2021-04-06 18:26:00 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@Lpl
我上一楼的回答的 1 中,即使 map 的 value 使用对象,然后 atomic 操作对象的 value 也不适合,因为最早 map 为空,拿不到对应的 value,如果判断空先存入,那还是要加锁,除非你的 key 数量和 key 值都是固定的、创建 map 时就初始化了 value
2021-04-06 18:23:12 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
@Lpl

1. atomic 做的原子操作是比加锁快吧

先看 3 的回答吧,因为锁不可避免,所以在这里根本不能使用 atomic

并且因为是按 map 的 key 进行统计,首先你得取这个 map key 对应的 value,而直接取 map[key] 的地址是不行的,你试试编译下:
m := map[string]int32{"a": 0}
atomic.AddInt32(&m["a"], 1)
会报错: "cannot take the address of m["a"]"


2. 用管道通过求摸建立多个协程来消费

相对比较复杂的并且需要保证临界区一致性的并发逻辑可以考虑用 chan 替代锁来避免锁的复杂度尤其死锁等情况,但是简单功能,就比如这种计数器,使用 chan 实现起来会比锁更麻烦并且性能稍微损失一点点,完全没必要,要从实际出发、不能照本宣科

3. 目的是为了每一个 key 都能并发安全,加细粒度的锁不用去加对象锁,concurrentmap 不就是这样做的吗

首先要解决获得这个 key 的 value,获得这个 key 本身就需要对 map 的锁
标准库的 sync.Map 一样内置锁来实现、只是应用层不需要自己使用锁罢了
其他的三方 concurrentmap 实现也并不能实现每个 key 粒度,而是为了减少 key 数量巨大时并发流的竞争,所以在标准库 map 之上再加一层 hash buckets,再每个 buckets 对应的结构上用一个锁,go 标准库自己的 map 本身就是个 hash 下面多个 buckets,三方 concurrentmap 相当于再加一层 hash 分开成多个锁来降低粒度为 bucket 级别减少竞争
2021-04-06 17:41:04 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
2021-04-06 17:39:33 +08:00
回复了 zkdfbb 创建的主题 Go 编程语言 map 的一个神奇的问题
accessLog = Counter{data: make(map[string]int)}
先改成
accessLog = &Counter{data: make(map[string]int)}
否则可能 panic

key 的问题,Counter 的 func 都把 key 先 trim 一下

@Lpl
另外,9 楼 3 条没一个是对的
2021-04-01 11:47:27 +08:00
回复了 lesismal 创建的主题 分享创造 发布个 golang 高性能异步网络框架 nbio,单击百万不是梦!
也不知道楼上有几位都是啥情况,老夫如此热情,连句话都不回,是因为看不懂吗。。。
2021-04-01 11:45:33 +08:00
回复了 pancl 创建的主题 Go 编程语言 为啥 go rpc 要这种形式(不知道用啥词原生?)
2021-03-28 00:29:40 +08:00
回复了 taowen 创建的主题 Visual Studio Code 在 Android 手机上运行 vscode
纯为了支持 json-iter 来占个楼 ^_^
2021-03-20 10:41:01 +08:00
回复了 lesismal 创建的主题 分享创造 NBIO 第二弹 —— 支持 Non-Blocking HTTP 1.x
@FucUrFrd *nix 进城内文件描述符的特点、产生与回收再利用可以看一下,数组对比下 map/rbt 的时间复杂度以及除了时间复杂度,那个复杂度的每次操作本身是包括哪些操作,都可以看下。
2021-03-20 00:52:27 +08:00
回复了 lesismal 创建的主题 分享创造 NBIO 第二弹 —— 支持 Non-Blocking HTTP 1.x
既然无国界,就不要上纲上线的
2021-03-20 00:52:06 +08:00
回复了 lesismal 创建的主题 分享创造 NBIO 第二弹 —— 支持 Non-Blocking HTTP 1.x
@FucUrFrd 如果跟太大陆了就跟 github 无国界冲突,那好多用英语的,太欧美了,其他非英语国家地区的人怎么办?这么讲的话,github 不能用地球国家的语言了
2021-03-20 00:46:35 +08:00
回复了 lesismal 创建的主题 分享创造 NBIO 第二弹 —— 支持 Non-Blocking HTTP 1.x
@FucUrFrd
1. NIUBILITY 即使太大陆了,也跟 github 无国界不冲突吧?难道 github 无国界所以就不能有大陆相关的了?你的逻辑思维有些乱,建议加强训练一下
2. 这个地方数组比 map/rbt 好,如果看不懂说明基础有点弱,多读好书补补
2021-03-19 16:30:49 +08:00
回复了 lesismal 创建的主题 分享创造 NBIO 第二弹 —— 支持 Non-Blocking HTTP 1.x
@lesismal 业务层的程序员小伙伴们完全可以继续用同步逻辑写代码,单就 http server 来讲,应用层是不受影响的

后续要做的 Upgrader 之类的,也是框架胶水层 wrap 一下,应用层的逻辑其实都可以不受影响。

BTW,websocket 实现得差不多了,争取下周放出来
1 ... 49  50  51  52  53  54  55  56  57  58 ... 63  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1382 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 17:17 · PVG 01:17 · LAX 09:17 · JFK 12:17
Developed with CodeLauncher
♥ Do have faith in what you're doing.