Mkdir700's Note

Mkdir700's Note

Rust

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

在开发桌面剪贴板同步应用(UniClipboard)过程中,遇到了一个令人头疼的问题:即使只修改与 objc2 库无关的代码,每次构建时 Rust 编译器仍会重新编译 objc2 库,严重影响开发效率。优化方案包括优化 Cargo 配置、使用 sccache 加速编译,通过并行编译提升、依赖差异化处理、缓存策略优化以及增量编译改进等机制提高构建效率。优化后,首次完整构建时间略有增加,但增量构建时间减少超过80%,开发体验从等待30-60秒减少到5-10秒。经验总结包括理解依赖关系、差异化处理、充分利用缓存以及在速度和代码质量之间取得平衡。这些优化技巧适用于处理慢速编译依赖的 Rust 项目,可显著提高开发效率。
223
0
1
2025-03-29

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

在 Rust 开发中,通过自定义静态方法实现类型转换,但为了更符合 Rust 惯用法,尝试使用 `From` trait,但遇到参数个数不匹配错误。解决方案是使用元组将参数组合成一个。另外,遇到路径类型不匹配问题,通过使用泛型参数使 `From` 实现更通用,能接受多种路径类型。`AsRef` trait 在 Rust 中实现灵活引用转换至关重要,提供统一转换方式,使 API 更灵活,避免重复代码。重构后的代码更符合 Rust 惯用法,接口更灵活,利用 Rust 强大的类型系统,可应用于各种类型转换场景,特别适用于设计接受多种相似类型的 API。在 Rust 中,优先使用标准 trait 进行类型转换,利用 `AsRef` / `AsMut` 实现灵活引用转换,通过泛型参数使 API 更通用。
173
0
0
2025-03-28

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

Rust 异步编程中常见错误是在持有 Mutex 锁后使用 .await,导致编译错误。问题在于 MutexGuard 不是 Send 的,而 .await 可能在不同线程间切换,违反线程安全。正确方式是在 .await 前释放锁,通过作用域控制确保 MutexGuard 在 .await 前释放。推荐使用异步友好的锁如 tokio::sync::Mutex,减少锁持有时间,优先使用作用域块控制锁生命周期以避免线程安全问题。
233
0
0
2025-03-16

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

异步互斥锁相较于同步互斥锁更"昂贵"的原因在于内部实现较为复杂,需要管理任务等待队列和唤醒机制,与异步运行时集成带来额外开销,通常在内部仍使用同步互斥锁,增加了一层间接性,需要创建和管理Future对象。因此,在不需要跨越.await点持有锁时,推荐使用标准同步互斥锁。只有在需要在持有锁的同时执行异步操作时,异步互斥锁的额外开销才是值得的。在高竞争场景下,异步互斥锁的开销更明显,对于大量互斥锁的应用,异步版本可能会消耗更多内存和CPU。
170
0
0
2025-03-15

Tokio:应该使用哪种 mutex?

互斥锁(Mutex)是一种同步原语,用于保护共享数据。标准库互斥锁在调用.lock()时会导致线程阻塞,而异步互斥锁在调用.lock().await时会挂起当前任务。标准库互斥锁不支持跨越.await点持有锁,可能导致死锁,而异步互斥锁可以安全跨越.await点。标准库互斥锁适用于短时间持有的场景,性能开销小;而异步互斥锁适合需要执行异步操作的场景,性能开销大。最佳实践是默认选择标准库互斥锁,对于IO资源考虑使用异步互斥锁。
227
0
1
2025-03-15

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

在 Windows 平台下构建 Rust 时,缺少 OpenSSL 可能导致错误。在 Linux 下可以用包管理工具解决,而在 Windows 需手动操作。解决方法为使用 choco 安装 OpenSSL,并设置环境变量后重启 VSCode 即可。引用链接:<li>https://juejin.cn/post/6994715287178182693</li>,<li>https://docs.rs/openssl/0.10.36/openssl/#manual</li>。
Tec
1041
0
0
2024-09-16
解决 Rust 测试中的并行执行冲突:保护共享资源的策略

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

在 Rust 开发中,测试是确保代码质量的关键环节。并行执行测试可能导致共享资源冲突,造成意外行为或测试失败。解决方案包括使用 serial_test crate 进行串行执行测试、互斥锁控制资源访问、创建独立测试环境、使用测试模块和一次性初始化,以及使用 #[ignore] 属性标记特别受影响的测试。选择适合项目需求的策略至关重要,保证测试可靠性和一致性。
Tec
124
0
0
2024-09-13