【Rust日報】 2019-05-14:Rust中哪些特性是零開銷抽象的

tract - 一個神經網絡訓練庫

Snips(一家作音頻識別的創業公司) 出品。在神經網絡領域,如今基本已經被 TensorFlow 和 PyTorch 給佔了。可是對於移動設備或IoT這些性能受限的設備,還有不少空間能夠嘗試。TensorFlow組推出了 TensorFlow Lite,微軟的 ONNX 看上去也頗有前景。一些硬件廠商也推出了他們本身的方案 Android NN API, ARM NN SDK , Apple BNNS 等等。可是它們都只能知足一些特定領域的需求。node

因而就有了 tract。在各個平臺的性能評測,性能是 TensorFlow Lite 1.2 倍到 4.2 倍。看得人有點心動。程序員

圖片

Read More
Reporedis

一個視頻,從 Node.js 到 Deno(v8+Rust)

Deno 是一個 JavaScript/TypeScript 運行時,做者其實就是 Node.js 做者。他以爲 nodejs 生態已經沒辦法再提升質量了,就建立了這個新項目 deno。下面是 Rafał Pocztarski 的視頻分享。數據庫

Video編程

Couchbase Rust SDK 1.0 alpha.1 發佈

這是官方的 Rust SDK。Couchbase 是一個商業的 NOSQL 數據庫。緩存

Repo安全

一篇博文:Rust語言目前在機器學習領域的狀態

這篇文章做者很是喜歡 Rust,分析了一下目前 Rust 中的機器學習生態的狀況。好比:網絡

  • const-genericsapp

  • generic-array機器學習

  • packed_simd

  • RustaCUDA

  • rsmpi

  • rayon

  • ndarray

  • ndarray-linalg

  • ndarray-stats

最後,做者打賭 Rust 在 ML/DL 領域能大展宏圖。進一步的討論能夠進 rust-ml 進行。

Read More

manticore - 一個用於研究目的的操做系統,Rust寫了其中一部分

目的是研究 parakernel。

Repo

Rust 職位:東京,機器人創業公司

job link

用 Rust 開發機器人?好誘惑。

zemeroth - 一個六邊形回合制遊戲

能夠在線玩兒:Online Play。

這篇文章詳細講述了這個遊戲的技術選型發展過程。目前,它綜合使用了:ggez, WASM, itch.io, visuals, AI, campaign, tests 等技術。文章寫得很是好,強烈推薦閱讀。

Rust 1.34.1 標準庫中發現一個安全漏洞

問題出在手動實現 Error::type_id 和 Error::downcast 家族函數的交互上。

即將立刻發佈 1.34.2 進行修補。

Read More

[教程]如何用rust爲redis寫一個client

主要講解了如何經過RESP實現一個redis client,並用rust實現了一個簡單的demo,目前只實現了set和get命令,能夠很方便的添加命令,項目地址以下redis-simple-rs歡迎你們完善。

@readlnh 投稿

Repo

穩定cargo 離線模式 pr合併了

Pr

這個的意思是,之後能夠指示 cargo 去本地找依賴包緩存。而不是每次都檢查網絡了。很是實用的進展。

等等穩定版的發佈,到時有使用說明。

multiqueue2 - 支持廣播能力的 mpmc 管道

聽起來好像很厲害?

Repo

一個頗有價值的問題:Rust中哪些特性是零開銷抽象的

link 在這裏討論的,如今我來整理一下,下面的都是零開銷的抽象:

  • tuple

  • gererics

  • traits

  • Option - 編譯器最後(視狀況)會把這一層包裝優化掉

  • Vec

  • Box

  • Range

  • for-loops

  • mod

  • zero-sized types (C++ can't do that because every value needs to have an address)

  • enum discriminant optimizations which I hope are done for Option and friends (storing None as 0)

  • 鏈式迭代器能夠產生更快的代碼,有時比for循環還快

  • await和Futures的實現估計也會比C++的實現消耗更少的內存分配,await不是零開銷的,可是會保持不多

  • 宏、構建腳本和常量初始化能夠輸出結構化的值,也是零開銷

  • ...

不是零開銷的部分:

  • &dyn Trait

  • ..

有人總結得好:

zero-cost does not mean no cost, it means no extra cost over manually writting code that does not use the abstraction, but emulates instead.

零開銷不是指沒有開銷,而是指與不用(Rust給出的)抽象而用手動直接模擬實現相比,沒有額外的開銷。

In general: when Rust has a feature F which implements a programming aspect A, and your program requires implementing aspect A, just picking feature F is typically going to be the right choice; reimplementing A yourself (either in Rust or in C or ...) will not yield better performance

一般來說:當 Rust 有一個特性 F,它實現了一個編程的方面(解決了那樣一種問題) A,如今你的程序要實現方面 A(解決那樣一種問題),通常來講,只須要直接拿起 F 使用就對了,你手動從新實現(用 Rust 或 C 或其它語言),並不能帶來更好的性能。

C++ implementations obey the zero-overhead principle: What you don't use, you don't pay for [Stroustrup, 1994]. And further: What you do use, you couldn't hand code any better.

-- Stroustrup

C++的實現聽從零開銷原則:你用不到的東西,不會爲其付出代價。更進一步:對於你用到的東西,你無法再作得更好。

-- Stroustrup

In the case of Rust, this applies even more since most of the optimization is offloaded to the compiler. In other words, in practice it is far easier to write slow C++ than slow Rust. In the case you are describing, tuples are slower because they are implemented above the compiler level and thus optimizations are left to the programmer. In Rust on the other hand, tuples are first-class citizens and they are optimized away by the compiler automatically.

對於Rust的狀況來講,編譯器會承擔大部分的優化工做,因此在這方面(相對於C++來講)走得更遠。換句話說,實踐中每每更容易寫出慢的C++代碼,而不是慢的Rust代碼。對於你描述的狀況,元組慢是由於它們實如今編譯器的上面一層,所以優化工做留給了程序員來作。而在Rust中,元組是一等公民,它們會被編譯器自動優化掉。

相關文章
相關標籤/搜索