V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  kneo  ›  全部回复第 1 页 / 共 45 页
回复总数  892
1  2  3  4  5  6  7  8  9  10 ... 45  
6 小时 59 分钟前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@bli22ard

> 就启动 goroutine ,不管是堆还是栈,没搞懂它有什么存

启动 goroutine ,实际上是你用 goroutine 加载了一个函数。栈就是这个函数的运行环境。哪怕是一个空函数,只要没被优化掉,也是一个函数调用,也必须有栈。

类似的,你在其它语言里启动一个线程也需要提供一个可运行函数(或者等价物)。这不是 GO 专有的概念。

> 如果是参数,变量,为什么要是 2kb ,而不是这些参数、变量的实际大小

栈的特点就是动态增长。因为函数调用需要把子函数的存储也分配到这个栈上。函数的嵌套越多,需要的内存就越多。

栈空间不够用就需要重新分配内存并且把旧的栈数据复制过去。(这里指的是虚拟线程,原生线程收到操作系统限制可能无法修改栈大小。)

如果初始化栈过小,频繁的扩容会影响性能。

初始栈过大,会造成内存浪费。

2KB 是一个性能权衡的结果。

您可能需要找一些函数调用和栈内存的示意图看一下。不一定非是 GO 的。
8 小时 19 分钟前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@bli22ard

> 更本质的是,为什么需要这个 2kb 内存,这 2kb 存的什么东西,这个期待有实力的人研究一下 runtime 。

2KB 就是栈啊……和其他语言没有本质区别。函数的参数,变量,闭包之类的。不过正常情况 Java 在栈上存对象只存指针,Go 因为有 struct ,相比 Java ,栈内存的使用频率会更多点,预分配的大一点也是合理的。
14 小时 15 分钟前
回复了 xzg1993 创建的主题 问与答 外观好看的 windows 本,有哪些推荐。
@sean419 明白。这机器不错的。如果有别的颜色更好。
16 小时 22 分钟前
回复了 xzg1993 创建的主题 问与答 外观好看的 windows 本,有哪些推荐。
@sean419 谢谢朋友,英雄联盟能跑到多少帧啊?我买了之后因为不能联网,测试了几个小游戏,像魔法工艺第一层 BOSS 才几十个弹幕就卡了,黎明前 20 分玩了几分钟也是明显卡。有个不吃显卡的 Noita 倒是很流畅。我感觉 CPU 确实不错,但是稍微用到 GPU 的可能就要拉胯了……我想了想就退了。
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@bli22ard

> 比较好奇,每个 goroutine 2kb ,到底存的是什么
> 最后 @lesismal @kneo 两位高手来围观

见笑了,谈不上高手。

我的理解这 2KB 就是预分配的栈大小。过小的初始栈可能会导致频繁的内存重新分配。
2KB 可能是 go 团队在性能测试之后得到的一个比较好的默认值。这个值也是经过多次调整的:

https://stackoverflow.com/questions/22326765/go-memory-consumption-with-many-goroutines

> in Go 1.4: the minimum size of the goroutine stack has decreased from 8Kb to 2Kb.
> https://github.com/golang/go/blob/bbd25d26c0a86660fb3968137f16e74837b7a9c6/src/runtime/stack.go#L72:
_StackMin = 2048


也许可以把 2KB 改成 1KB 重新编译一个 go 版本,内存测试的结果就和 Java 一样了。当然前提是 1KB 对这个测试来说够用,够不够用我也不知道……

当然真实环境大家确实不在意一个 goroutine 占用了 2KB 是不是太多。但是这个测试至少让我们知道了这个 2KB 的存在。程序员总是对这种小细节感兴趣的。
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 哈哈,给你机会了。既然你不会我就帮你个忙。

Wiki 中很明确的提到了 stackful 和 stackless:

https://en.wikipedia.org/wiki/Coroutine#Definition_and_types

> Besides that, a coroutine implementation has 3 features:
> - ...
> - ...
> - whether a coroutine is able to suspend its execution from within nested function calls. Such a coroutine is a stackful coroutine. One to the contrary is called stackless coroutines, where unless marked as coroutine, a regular function can't use the keyword yield.

同时也举例了:

https://en.wikipedia.org/wiki/Coroutine#Lua

> Lua has supported first-class stackful asymmetric coroutines since version 5.0 (2003), in the standard library coroutine.

很明显,有栈协程和无栈协程都是协程,不是加个定语就可以随便用的。Wiki 也不是连个有栈无栈都不懂的“过时”信息。

同一页面也明确指出了:

https://en.wikipedia.org/wiki/Coroutine#Go

> However, goroutines are not coroutines (for instance, local data does not persist between successive calls).

goroutines 不是协程,加再多定语也没用。

这个总结不是给 @CloveAndCurrant 这种人看的,他除了嘴硬啥也不懂。但我相信其他人看了自然能明辨是非。

我不相信 @CloveAndCurrant 能再给出任何有意义的回复了。不和他聊了。
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 嘴硬。
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 哈哈,光会说,您倒是引用一个 wiki 说“goroutines 是有栈协程”给我看看啊。需要我帮你吗?
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 哈哈,您真是定义的神啊。您来定义下我是在“引用 wiki”还是在“抠字眼”?


https://en.wikipedia.org/wiki/Coroutine#Go

However, goroutines are not coroutines (for instance, local data does not persist between successive calls).
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 哦?

我引用你说 wiki 不是真理?

我说大家 wiki 和你二选一,你开始骂人“老 B 登”。

我说到让你爸来投票,你开始求我别拿 wiki 抠字眼?你是真怕他不选你啊?

我都被你逗笑了,这是你的职业吗?
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 你也不会别的啊。上来就输出一个 goroutine 是协程然后还砸脚了,然后说别人“抠字眼”哈哈。然后除了吹牛,又“工程领域”又“wiki 不是真理”的,好像你亲妈给你起名叫真理似是。

信不信让你爸来他都会选 wiki:宁要 wiki 不要逆子。
1 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@CloveAndCurrant 诶呦,好几天了,咋还是那套车轱辘话啊。我以为你学了啥新东西来怼我呢。也是,您这辈子就这样了,连个术语都改不过来,哪还能学会新东西啊。昨天吃几碗饭没忘就不错了。

不过你总碰瓷 wiki 干啥啊?你脸不要啦?你连个术语都搞错,还代表“工程领域”否定 wiki ,好在没人把你当回事。

你觉得 wiki 是错的,但是你不说你觉得,那你就是对的了?你可真是个小天才哈哈。不知道你家长给你配手表了吗?

你和 wiki 二选一,真不知道整个地球上除了你 MA 还有谁会选你。[捂嘴笑]
格盘别选快速格式化就行。Windows 或者大多数软件都能解决。格完物理销毁,没人会捡你的垃圾再费劲儿恢复数据偷看的……
3 天前
回复了 Canglin 创建的主题 买买买 朋友们黑五都买啥了
买了十几个小游戏,花了两百。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@ykrank 哈哈,无所谓了,我心里有数。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333

> 作者这样搞不是有目的就是真不知

作者就是随手撸几段代码测一下,我看到的是单纯的程序员的快乐。不要阴谋论啦。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333

> 那这种测试结果本身基准就不平 得出的结论也就看看就好

额,怎么说呢……测试结果,看的就是某个语言使用某种实现能得到什么样的性能。我们只要客观的理解数字就可以了。

只有带入过多感情,认为有些数值高的赢了,某些数值低的好像输了,才会纠结“公平”。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333 我不认为不相似就没有可比性。性能测试的重点之一就是从一个方面提供不同策略不同实现之间的差异给人做参考。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@lesismal 我完全理解 goroutine pool 在生产环境里的作用。这东西 Java 用了几十年了,什么好说的。

但是如果 goroutine 的成本真的便宜到几乎免费,我们大多数时候是不需要因为“性能问题”而使用 pool 的。使用 pool 的主要用例应该是间接限制 goroutine 所对接的外部资源。

如果还是因为 goroutine 本身的性能原因而使用 pool ,我认为就语言实现层面还是差点意思。

回到这个帖子所引用的原文,我认为它至少从一个方面回答了到底在哪还差了点。
4 天前
回复了 hez2010 创建的主题 程序员 运行 100 万个异步并发任务需要多少内存
@james122333 额,好吧,我还是维持我的观点。
1  2  3  4  5  6  7  8  9  10 ... 45  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1513 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
Developed with CodeLauncher
♥ Do have faith in what you're doing.