Goose 的 3.51 倍来自惯用 C++
这篇帖子整理新语言 Goose 公布的性能数字。作者 GenericPointer 2026 年 11 月 2 日把 r/Compilers 的帖子转到 r/rust,采集时 0 分、6 条评论。原帖标题写,Goose 相对 C++ 和 Rust 有 3.51 倍提速,并有引用稳定的动态容器。
帖子写,基准一共 16 项。3.51 倍是相对 idiomatic C++ 的结果。相对 hand optimized C++ 是 1.24 倍,相对 safe Rust 是 1.13 倍。帖子写,这些对比没有说明用的是哪一种 Goose,也没有给 optimized 下客观定义。
帖子列出 Goose 更慢的几项。LRU 基准里,相对 expert C++ 是 0.88 倍,相对 safe Rust 是 0.81 倍。scene 基准相对 safe Rust 是 0.82 倍。calculation 基准相对 safe Rust 是 0.91 倍。作者写,3.51 倍是对结果的选择性呈现。
关于动态容器,帖子引用 Goose 文档:每个可伸缩容器有自己的 data stack,增长时推进 bump pointer。帖子写,每个 data stack 默认预留数 GB 虚拟地址空间,需要时再提交物理内存,引用保持稳定。虚拟地址空间用完后,程序会被终止。帖子把这个终止写成接不住的异常。
帖子把性能来源列成几件事:分配路径上没有通用分配器,没有逐对象析构,数据连续存放,用窄的相对引用,变长 enum 更紧凑,容器增长时不搬移元素。
phazer99 的评论有 17 分,写 Goose 在多数场景里算不上 Rust 的竞争者。timClicks 的评论有 3 分,写基准拿出来时本来就不会因为公平。
原文链接:https://www.reddit.com/r/Compilers/comments/1xm3lxd/351x_speedup_against_c_and_rust_why_gooses_claims/
collect() 的签名里没有 Vec
《Thinking in Traits》是 corrode.dev 上的一篇文章,讲 Rust 里 trait 怎么把类型组合起来。作者 mre__ 2026 年 11 月 2 日发到 r/rust,采集时 89 分、19 条评论。
文章从 Iterator::collect 写起。签名是:
fn collect<B: FromIterator<Self::Item>>(self) -> B
签名里没有 Vec。collect 要求目标类型能从迭代器构造自己。Vec<T> 实现了 FromIterator<T>,所以下面这行能编过,元素类型由上下文推断:
let doubled: Vec<_> = numbers.iter().map(|x| x * 2).collect();
String 可以收集字符。HashMap 可以收集键值对。HashSet<T> 还要求 T: Eq + Hash。
文章把调用展开成 iterator.collect::<Vec<T>>(),再转到 Vec::<T>::from_iter(iterator)。概念上是新建 Vec,循环 next(),再 push。迭代器不必知道 Vec 怎么存元素。Vec 不必知道元素从哪来。新的迭代器可以喂已有集合。新实现 FromIterator<T> 的集合可以接已有迭代器。
文章举了 Java 的 SSLSocket。它是 Socket 的子类。Socket.shutdownOutput() 用来半关闭 TCP,停发、继续收。Android API 21 到 23 上,平台的 SSLSocket 对这个操作抛 UnsupportedOperationException。OkHttp 5.2.0 因此崩溃,issue 是 square/okhttp#9123。文章写,现在的 OpenJDK 支持 TLS 感知的 shutdown,这是一处历史不匹配。
标准库把 Read 和 Write 分成两个 trait。&[u8] 实现 Read。std::io::sink() 返回的 Sink 实现 Write。TcpStream 两个都实现。std::fs::File 也两个都实现。文件以只读方式打开时,写入仍会在运行时失败。
Vec<T> 在 T: Clone 时实现 Clone。文章用一个 Batch<T> 包装说明同一件事:Batch<String> 可以 clone,Batch<TcpStream> 不能,因为 TcpStream 没有 Clone。标准库给实现了 Display 的类型实现 ToString。实现 From<T> for U 之后,blanket impl 会给出 Into<U> for T。
File 包进 BufReader 之后仍实现 Read。再调用 .take(limit),得到 Take<BufReader<File>>,也实现 Read。接受 R: Read 的解析器按字节读,不用分别为文件、带缓冲的文件、限长的文件各写一份。
surister 的评论有 28 分,指出文中这句像生成文本:The value of an abstraction is the code that no longer needs to exist between its users. 作者回复,这句话事后看比较机械,可以改写或删掉。JAZthebeast11 的评论有 35 分,引用了 Dijkstra:The purpose of abstracting is not to be vague, but to create a new semantic level in which one can be absolutely precise.
原文链接:https://corrode.dev/blog/thinking-in-traits/
tellus 0.5 的 ActorRef 可以指向另一台机器
tellus 是 Rust 上的 actor 框架,跑在 Tokio 上。作者 quest_for_7c 2026 年 11 月 2 日发到 r/rust,采集时 6 分、3 条评论。文章在 heikoseeberger.de。
作者在评论里写,消息处理是同步的,death watch 有顺序保证,另外有监督和事件溯源。集群功能在 0.4.0 随 cluster feature 出现。0.5 在这上面继续做。打开这个 feature 后,ActorRef 实现 Serialize 和 Deserialize,可以放进消息,例如 reply_to: ActorRef<Reply>。ReplyTo 也一样。接收方用同样的方式回复,消息可以来自本进程,也可以来自别的节点。tell、ask、watch 对远程 actor 和本地 actor 用同一套调用。
文章里的节点先用 QuicTransport::dev(addr) 打开 QUIC,再 cluster::start_endpoint,然后 cluster::bootstrap(FixedSeeds::new(seeds), BootstrapConfig::new())。种子集合里还没有集群时,只有种子和本机地址中最低的那个地址可以建集群,并且该集合里的严格多数要报告没有集群。QuicTransport::dev 跳过证书检查,只在 cluster-dev feature 后面。生产环境用双向 TLS,证书绑定节点公布的地址。示例在 tellus 仓库 tellus-v0.5.3 的 tellus/examples/tutorials/clustered/02_remotable_messages.rs。
成员关系没有 leader。每个节点把自己的成员列表 gossip 给其他节点。成员状态只向前走:Up、Left、Down。phi accrual failure detector 把成员标成不可达,downing provider 决定何时移除。默认 KeepMajority:分区里看得到多数成员的一侧留下,另一侧把自己标成 Down。偶数分裂时,地址最低的成员所在一侧留下。远程 death watch 仍然有序:actor 终止时,Terminated 排在它已经投递的消息后面。节点被 down 时,Terminated 表示这个节点不会再投递消息。down 过的节点不会以同一成员身份回来,重启后是新的 incarnation。
0.5 还带这些部分。receptionist 用带类型的 key 注册 actor,任意成员可以查找,上面有 pub-sub。bootstrap 可以用 tellus-bootstrap-dns,也可以用 tellus-bootstrap-k8s。graceful leave 会宣布离开,并尽量排空队列。集群状态可以当值读,也有变更流。tellus-cluster-inspect 是一个 axum router。配置可以用 YAML,或其他 serde 格式。0.5 给 actor 加了可选 timer。
文章写了限制。gossip 按每个成员、每个心跳间隔发一帧,几十个节点可以,几百个还不行。两节点集群丢掉地址更低的那个节点后活不下来,要扛一次故障需要三个节点。分成两面以上的分区,可能没有存活的一侧。两个成员互相连不上、但都能连上其他人时,集群报告断链,不 down 任何一方。它们之间的消息会排队,然后变成 dead letter。ask 超时。watch 保持沉默,直到链路恢复,或操作员 down 掉其中一个。
Sovairon 问过一致性。作者回复,消息层是 at most once,两个 actor 之间有序。可靠性靠 request-response、重试和幂等接收方。活性是另一层:death watch 用来知道何时停止等待。
原文链接:https://heikoseeberger.de/2026-11-02-tellus-cluster/
rust-analyzer #352 用 ThinMap 省下 38MB
rust-analyzer changelog #352 是 2026 年 11 月 2 日的更新说明。作者 WellMakeItSomehow 同一天发到 r/rust,采集时 28 分、0 条评论。
新功能有两项。#23573 和 #23572 升级 rustc_lexer,并处理强制关键字 k#。
性能一项。#23228 加入 ThinMap。长度短的时候用 ThinVec。changelog 写,在 rust-analyzer 自己的代码上省下 38 MB。
修复四项。#23534 修 push diagnostics,这是一次首次贡献。#23495 修投影类型上的 panic。#23562 不再补全 f(*&val)。#23586 修 async gen 里 yield 的 lowering。
内部三项。#23588 改用 macOS 15 runner,并提高 deployment target。#23577 去掉 InferenceResult.error_ty。#23576 升级 rowan。
原文链接:https://rust-analyzer.github.io/thisweek/2026/11/02/changelog-352.html
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论