【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::PinAPI的其他用例(例如不穩定生成器特徵的使用等)也很有用。

使用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語言學習交流