Mkdir700's Note

Mkdir700's Note

Rust

Rust 项目中解决依赖重复编译问题:以 objc2 为例

在开发桌面剪贴板同步应用时,遇到了一个令人烦恼的问题:即使只修改与 objc2 库无关的代码,每次构建时 Rust 编译器仍然会重新编译 objc2 库,严重影响开发效率。通过优化 Cargo 配置以及使用 sccache 加速编译等优化策略,有效提高了构建效率。优化后,首次完整构建时间略有增加,但增量构建时间减少了80%以上,开发体验得到明显改善。优化经验包括深入了解依赖关系、差异化处理依赖包的编译策略、合理利用缓存以及在速度与代码质量间做出权衡。这些优化技巧不仅适用于处理 objc2 库,也可应用于其他包含慢速编译依赖的 Rust 项目,有助于提高 Rust 项目的开发效率和编码体验。
142
0
1
2025-03-29

Rust 中优雅地实现类型转换:从自定义方法到通用 trait

在 Rust 开发过程中,优化类型转换代码是一个常见需求。一种优雅的实现方式是使用 Rust 标准库提供的 `From` trait。但在实现中,需要注意传入参数只能有一个泛型参数的限制。针对路径类型不匹配的问题,可以通过泛型参数的方式使得 `From` 实现更加通用。同时,`AsRef` trait 在 Rust 中实现灵活引用转换时具有重要性,可以提供统一的类型转换方式,使得 API 更加灵活。通过这次重构,代码更符合 Rust 惯用法,接口更灵活,利用了 Rust 强大的类型系统,这种模式可以应用到许多类型转换的场景中。记住在 Rust 中优先使用标准 trait 进行类型转换,使用 `AsRef` / `AsMut` 实现灵活的引用转换,通过泛型参数使得 API 更通用。
114
0
0
2025-03-28

Rust 异步线程安全问题解析与修复

在 Rust 异步编程中,持有 Mutex 锁的情况下使用 .await 会导致编译错误,因为 MutexGuard 不是 Send 的。为了解决这个问题,可以在 .await 前释放锁,并考虑使用 tokio::sync::Mutex 或更细粒度的锁策略。在异步编程中,通过控制锁的生命周期和使用作用域块来确保安全操作是关键原则。因此,在 Rust 异步代码中需要特别注意锁的使用方式,避免线程安全问题。
107
0
0
2025-03-16

Tokio:为什么异步互斥锁比同步互斥锁更"昂贵"

异步互斥锁相较于同步互斥锁更昂贵的原因在于其复杂的内部实现,需要管理任务等待队列和唤醒机制,与异步运行时的集成带来额外开销,通常在内部仍使用同步互斥锁,增加一层间接性,并需要创建和管理Future对象。因此,在不需要跨越.await点持有锁时,推荐使用标准同步互斥锁。只有在需要在持有锁的同时执行异步操作时,异步互斥锁的额外开销才是值得的。
92
0
0
2025-03-15

Tokio:应该使用哪种 mutex?

互斥锁(Mutex)是用于保护共享数据的同步原语,在标准库和异步库中有不同行为和性能开销。标准库互斥锁会阻塞线程,并适合短时持有、不需要异步操作的场景;而异步库的互斥锁会挂起当前任务而不阻塞线程,适合需要执行异步操作、可能长时间持有锁的场景。最佳实践是默认选择标准库互斥锁,除非需要特殊异步操作。可将互斥锁包装在结构体中提供方法操作内部数据,对于IO资源,则考虑使用专门的管理任务。
140
0
1
2025-03-15

解决在 Windows 上 openssl-sys 构建失败的问题

在 Windows 构建时缺少 OpenSSL,需要手动操作。设置 `OPENSSL_DIR` 环境变量并安装 `libssl-dev`。可通过 choco 安装 OpenSSL,设置环境变量后重启 VSCode。参考链接:https://juejin.cn/post/6994715287178182693, https://docs.rs/openssl/0.10.36/openssl/#manual.
Tec
781
0
0
2024-09-16
解决 Rust 测试中的并行执行冲突:保护共享资源的策略

解决 Rust 测试中的并行执行冲突:保护共享资源的策略

在 Rust 开发中,测试是确保代码质量的关键环节。并行执行测试可能导致共享资源冲突。解决方案包括使用 serial_test crate 进行串行测试,互斥锁控制资源访问,创建独立测试环境,使用测试模块和一次性初始化,以及忽略特殊测试。选择适当策略取决于项目需求,但重要的是意识到并行测试可能带来的问题,并采取措施确保测试可靠性。
Tec
92
0
0
2024-09-13