【Rust日报】2019-09-24 Rust小程序为何会卡顿?
- 2019 年 10 月 8 日
- 筆記
Graphlib发布0.5.0版本
Graphlib是一个为图数据结构提供通用且易于使用的API的rust图形库,它的API与std::collections
中的其他数据结构相似,它是为了在Purple协议中使用而构建的。
更新日志:
- 现在可以在使用dot功能的时候标记图像顶点。
- 添加了
Graph::map()
API,该API将Graph <T>
映射到了Graph <E>
。
前往GitHub了解更多信息
Purple协议官方Rust已经部署
Purple是一种高度可扩展的通用去中心化分类账协议,最先进的算法和架构设计。Purple有可能达到每秒处理数以千计的事务之高效率,这或将推动去中心化分类账技术的主流应用。
Purple协议对其支持的应用程序类型是未知的,他支持的应用程序可以是任何东西,从没有属性的简单的已发行资产到成熟的去中心化保险单或KYC。
但目前这个协议仍然是实验性质的,还需要在一个大型网络上进行压力测试之后才能确定其是否能稳定使用。
前往GitHub了解更多
Ergo-pin 0.1发布
ergo-pin 21 是一个提供更符合人体工程学的堆栈固定API的实验。当前的主要用例是在异步函数中,但对于std::pin::Pin
API的其他用例(例如不稳定生成器特征的使用等)也很有用。
使用ergo-pin,您只需在一个项目上应用该属性,即可在该项目内使用 PIN!
宏来连接一切表达式:
fn get_reader() -> impl futures::io::AsyncRead + !Unpin { ... } fn get_stream() -> impl futures::stream::Stream<Item = u32> + !Unpin { ... } #[ergo_pin] async fn foo() -> io::Result<[u8; 4]> { let mut buffer = [0; 4]; pin!(get_reader()).read_exact(&mut buffer).await?; buffer } #[ergo_pin] async fn bar() { let mut stream = pin!(get_stream()); while let Some(value) = stream.next().await { dbg!(value); } }
点击这里了解更多
Rust小程序为何会卡顿?
观察一个用Rust和Kotlin编写的小程序,为何Rust版本会比Kotlin的慢?主要原因就是分配了很多新的Vecs。想要提速的第一部是使用预定大小初始化Vecs,下一步是不使用Vecs,而是通过使用其他数据结构(例如Iterator)或使用预分配的缓冲区来优化这些分配。最后,进行一些格式上的修正以及一些细微的更改(例如使用u32代替usize来实现)等。
结果新版本并不完美,但至少解决了主要问题,以下是测量反映出来的结果:
// KOTLIN (JVM), Windows 10 Running Movegen depth=7 ... 319406385 // "Checksum", to make sure both programs are correct Time: 8424ms // RUST, Windows 10, built with cargo build --release >>> Starting movegen... 319406385 <<< Finished. Elapsed: 16s 895ms // KOTLIN (JVM), Ubuntu (different machine) Running Movegen depth=7 ... 319406385 Time: 7285ms // RUST, Ubuntu >>> Starting movegen... 319406385 <<< Finished. Elapsed: 8s 163ms // Windows, depth = 8 Kotlin 70s 70ms vs Rust 139s 403ms // Ubuntu, depth = 8: Kotlin 65s 222ms vs Rust 65s 554ms
render
: 基于JSX的安全类型模板
render
本身是一个特征、结构和宏的组合,它们统一并增强了构成树形数据结构的体验,最适合HTML和XML渲染,但也可以与其他例如ReasonML的Pastel
终端颜色库一起使用。
前往GitHub了解更多
actix-web 修饰符 decorator
开源代码 https://github.com/gothame/rflask
两个宏可为您减少两行代码。
use actix_web::{web, App, HttpRequest, HttpServer, Responder}; use awf_help::{config, route,route_res, ServiceFactory}; #[route(GET, "/")] fn greet(req: HttpRequest) -> String { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!", &name) } struct Hello{ } #[route_res("/api/auth")] impl Hello { fn get(req: HttpRequest) -> String { format!("get Hello !") } fn post(req: HttpRequest) -> String { format!("post Hello !") } } fn main() { HttpServer::new(|| App::new().configure(config)) .bind("127.0.0.1:8000") .expect("Can not bind to port 8000") .run() .unwrap(); }
Ndarray 0.13 发布
经历了10个月,他的最新版本终于发布上了crates.io。
ndarray为通用元素和数字提供n维数组,其实质与Python的NumPy类似。
新增功能:
集成 rayon 支持:将yanon支持移入Crate。可以从数组运行并行迭代器,并行化Zip原语,以对多个数组或其他NdProducers进行锁步迭代。
Raw 视图:如果ArrayViewMut类比于&mut T,则新的RawArrayViewMut类似于* mut T,并作为数组视图。这对于我们的内部组件来说是一个有用的低级原语,它将帮助我们编写与正在开发的不安全代码准则兼容的Rust程序。
Approx 支持:ndarray现在支持更灵活的近似比较。
改良 azip!() 语法:azip是用于在多个数组或NdProducers上编写锁步循环的宏,现在它的语法与通常的for循环更相似。
更多升级:新方法.as_standard_layout() 新数组存储类型CowArray 新方法.mean() 运行时能够检测到的SIMD支持的matrixmultiply
前往GitHub了解更多
IntelliJ Rust更新日志
https://intellij-rust.github.io/2019/09/23/changelog-106.html
DataFusion 0.15.0 支持并行查询操作
https://andygrove.io/2019/09/datafusion-0.15.0-release-notes/
From 日报小组 @Lance
日报订阅地址:
独立日报订阅地址:
- Telgram Channel
- 阿里云语雀订阅
- Steemit
- GitHub
社区学习交流平台订阅:
- Rust.cc论坛: 支持rss
- Rust Force: 支持rss
- 微信公众号:Rust语言学习交流