< 返回版块

苦瓜小仔 发表于 2025-07-03 08:01

Tags:日报

文章《The Waker Allocation Problem》

作者:Yoshua Wuyts (Rust 异步工作组成员)

此文探讨了 Rust 异步系统中 Waker 分配问题,以及 !Send Waker 的问题。

文章指出,为了实现高效的并发执行,异步任务需要中间 Waker 来唤醒子任务,但这带来了两种困境:

  • 不分配内存时,唤醒行为呈二次方复杂度(O(N²)),大量任务时效率低下;
  • 分配内存时,虽可实现线性复杂度(O(N))唤醒,但隐藏的内存分配又会影响性能。

作者通过 future::join 函数的实现示例,展示了如何通过创建中间 Waker 来优化唤醒行为。

当前 Future 特性设计存在诸多问题,不仅仅是上述内存分配问题,还有 SendSync 约束问题:在单线程系统中, Waker 仍然需要 + Send + Sync 约束。

即使如果我们最终添加一个 LocalWaker 类型,仍然需要原始 Waker 类型存在。这意味着我们实际上无法编写可移植的基于异步的 !Send 库,因为该绑定永远不会在类型系统中出现。

这些问题限制了异步编程的灵活性和效率,作者计划在后续文章中进一步阐述这些问题。

阅读:https://blog.yoshuawuyts.com/the-waker-allocation-problem/

sdr-podcast:sans-io

在本期 SDR Podcast 中,James 和 Amos 就 sans-io 技术展开了热烈讨论。

sans-io 是一种编写协议库的方法,主张将解码和状态机逻辑与实际的 I/O 操作分离,以提高代码的可移植性和可测试性。

James 认为,尽管 sans-io 有其优势,但 async/await 的出现使得编译器能够自动生成状态机,从而减少了手动编写状态机的需求。

他指出,使用 async/await 可以避免复杂的循环和匹配语句,使代码更加简洁易读。

Amos 则认为,尽管 async/await 有其便利之处,但 sans-io 在某些情况下仍然是一个更好的选择,尤其是在需要与底层 I/O 系统紧密集成时。

他还提到,async/await 的一些问题,如栈溢出和调试困难,仍然需要解决。

两人还讨论了 Rust 语言的未来发展,以及如何更好地支持 async/await 编程。

收听:https://sdr-podcast.com/episodes/sans-io

Slides:https://sdr-podcast.com/slides/2025-06-11-sans-io.pdf

sdr-podcast:在 macOS 上自动化截取透明 DOM 元素的图片

在本期 SDR Podcast 中,Amos Wenger 探讨了如何自动化 macOS,特别是如何获取透明的 DOM 元素截图。

他分享了自己在制作文章和视频时,如何通过自动化工具提高效率。

Amos 介绍了多种方法,包括使用 Safari 的开发者工具、AppleScript 和 JXA(JavaScript for Automation)。

他还讨论了如何利用 macOS 的无障碍功能来控制应用程序,并展示了如何通过 AppleScript 操作 Safari 的开发者工具来捕获元素截图。

尽管过程中遇到了许多挑战,但 Amos 最终成功实现了自动化截图,显著提高了工作效率。

收听:https://sdr-podcast.com/episodes/automating-macos

Slides:https://sdr-podcast.com/slides/2025-06-04-automating-macos.pdf

jemalloc 已归档,事后回顾

Jason Evans 对 jemalloc 内存分配器 20 年发展历程进行了回顾。

jemalloc 最初是为 Lyken 编程语言开发的,后因 FreeBSD 系统对多处理器支持的需求,被集成到 FreeBSD 中。尽管在集成后遇到了严重的内存碎片化问题,但经过改进,jemalloc 成为了 FreeBSD 的一部分。

随后,jemalloc 被移植到 Linux 和 Windows 系统,并在 Firefox 中得到应用,但与 Firefox 的集成并不顺利。

2009 年,jemalloc 开始在 Facebook 的基础设施中使用,Facebook 的内部数据对 jemalloc 的开发起到了巨大的推动作用。然而,随着 Facebook 转变为 Meta,对 jemalloc 的投入逐渐减少。

文章最后提到,目前 jemalloc 的上游开发已经结束,未来可能需要其他人创建分支来继续发展。

阅读:https://jasone.github.io/2025/06/12/jemalloc-postmortem/

文章《从零构建 2D 导航网格寻路系统》

这篇文章介绍了如何从零开始构建一个2D导航网格(navmesh)寻路系统。

作者使用Rust语言,通过Delaunay三角剖分生成基础导航网格,并将其转换为图结构以供A*算法使用。

文章详细解释了如何定位点在三角形中的位置、移除被阻塞的节点、优化路径等关键步骤,并提供了交互式演示。

作者还讨论了该系统在实际应用中的局限性,如路径次优、边缘问题、多单位移动等,并提出了改进方向。

阅读:https://gabdube.github.io/articles/navmesh_pathfinding/navmesh_pathfinding.html

Reddit:https://www.reddit.com/r/rust/comments/1lp0lpa/2d_navmesh_pathfinding_in_rust/

Hayro:PDF 光栅化工具

hayro 是一个用纯 Rust 编写的实验性 PDF 光栅化 (rasterizer) 工具,目前是该领域最全面的实现之一,但仍有许多功能缺失和问题待解决,代码也需要清理和文档化。

其在线演示工具可在 https://laurenzv.github.io/hayro 访问,但网页版不支持嵌入的 JPEG2000 图像。

编者注:PDF 光栅化是指将 PDF 文件中的矢量图形、文字和图像等内容转换为光栅图像(位图)的过程。光栅图像由像素组成,每个像素都有一个颜色值,适合在屏幕上显示或打印。

仓库:https://github.com/LaurenzV/hayro

Reddit:https://www.reddit.com/r/rust/comments/1lp7hlz/hayro_an_experimental_workinprogress_pdf/

Clickhouse-arrow:高性能 ClickHouse 客户端库,原生集成 Arrow

clickhouse-arrow 是一个高性能的 Rust 客户端库,用于与 ClickHouse 数据库交互,支持原生协议和 Apache Arrow 集成。

它提供零拷贝反序列化、最小化内存分配、高效流式处理大数据集等功能,支持 LZ4 和 ZSTD 压缩,兼容 ClickHouse Cloud。

该库还支持从 Arrow 架构直接创建 ClickHouse 表、精细控制类型映射等。

它基于 Tokio 构建,支持连接池,具有 90% 以上的测试覆盖率。

仓库:https://github.com/GeorgeLeePatterson/clickhouse-arrow

Reddit:https://www.reddit.com/r/rust/comments/1lpcklg/clickhousearrow_v010_highperformance_clickhouse/

视频:介绍线程 - Rust 惯用语法的简单步骤第 15 集

观看:http://youtube.com/watch?v=04PZPs7fbuo

讨论:写了 5 年的 Rust 代码,我仍然只是 .clone() 直到编译通过

高赞回答:

“我发现,简单的范例(以引用作为参数并返回拥有的值)已经消除了 95% 的 .clone () 使用率。”

“好!反正一半的 C++ 代码都是隐式地这么做的。我敢发誓,Rust 成长过程中的很多烦恼都源于调用 clone 时感觉不好,而在 C++ 中,在同一个地方传递值却不会感觉不好,因为 C++ 的语义和 clone 完全一样。”

Reddit:https://www.reddit.com/r/rust/comments/1lpc85o/ive_been_writing_rust_for_5_years_and_i_still/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页