Rust初體驗(yàn)
寫了多年的Java,某天機(jī)緣巧合之下聽說(shuō)了一門語(yǔ)言叫Rust彻采,Rust的親爹是Mozila腐缤,如果要和其它語(yǔ)言拼爹的話,實(shí)力應(yīng)該還是可以的肛响。
官方介紹如下:
Rust is blazingly fast and memory-efficient: with no runtime or garbage collector, it can power performance-critical services, run on embedded devices, and easily integrate with other languages.
Rust速度快得驚人岭粤,內(nèi)存效率也很高。沒(méi)有運(yùn)行時(shí)或垃圾收集器特笋,它可以為性能關(guān)鍵的服務(wù)提供強(qiáng)大支持剃浇,可以在嵌入式設(shè)備上運(yùn)行,并且很容易與其他語(yǔ)言集成。
Rust’s rich type system and ownership model guarantee memory-safety and thread-safety — enabling you to eliminate many classes of bugs at compile-time.
Rust豐富的類型系統(tǒng)和所有權(quán)模型保證了內(nèi)存安全性和線程安全性——使您能夠在編譯時(shí)消除許多各種各樣的bug虎囚。
Rust has great documentation, a friendly compiler with useful error messages, and top-notch tooling — an integrated package manager and build tool, smart multi-editor support with auto-completion and type inspections, an auto-formatter, and more.
Rust的文檔很強(qiáng)大角塑,有一個(gè)友好的編譯器,能提示一些有用的錯(cuò)誤信息淘讥,以及一流的工具——一個(gè)集成的包管理器和構(gòu)建工具圃伶,支持自動(dòng)完成和類型檢查的智能多項(xiàng)編輯器,一個(gè)自動(dòng)格式化程序适揉,等等。
我已經(jīng)在上文中把今天的重點(diǎn)加粗標(biāo)識(shí)了煤惩。打算用一個(gè)LeetCode上的算法題目來(lái)對(duì)比下Java實(shí)現(xiàn)和Rust實(shí)現(xiàn)嫉嘀,看看Rust是不是真的很驚人。
題目如下:
給定一個(gè)非空整數(shù)數(shù)組魄揉,除了某個(gè)元素只出現(xiàn)一次以外剪侮,其余每個(gè)元素均出現(xiàn)兩次。找出那個(gè)只出現(xiàn)了一次的元素洛退。
歡迎留言討論瓣俯。微信/知乎可搜索碼神手記同名賬號(hào),分享關(guān)注兵怯,共同進(jìn)步彩匕。
示例1:
輸入: [2,2,1]
輸出: 1
示例2
輸入: [4,1,2,1,2]
輸出: 4
解法:利用異或運(yùn)算(XOR)的特性,使用位操作進(jìn)行計(jì)算媒区。
先來(lái)一起復(fù)習(xí)下XOR的特性:
- 對(duì)0和任意數(shù)進(jìn)行XOR運(yùn)算驼仪,得到的仍然是這個(gè)數(shù)本身,即a^0=a袜漩。
- 對(duì)同一個(gè)數(shù)進(jìn)行XOR運(yùn)算绪爸,返回的結(jié)果是0。即a^a=0宙攻。
- XOR滿足交換律和結(jié)合律奠货。即aba=(aa)b=0^b=b。
以下是擼代碼環(huán)節(jié)......
Java版本:
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result = result ^ num;
}
return result;
}
}
Rust版本:
impl Solution {
pub fn single_number(nums: Vec<i32>) -> i32 {
let mut result: i32 = 0;
for num in nums {
result = result ^ num;
}
return result;
}
}
執(zhí)行結(jié)果整理到一個(gè)表格中座掘,便于直觀地對(duì)比:
語(yǔ)言 | 執(zhí)行用時(shí) | 內(nèi)存消耗 |
---|---|---|
Java | 1ms | 40.9MB |
Rust | 0ms | 2.1MB |
從數(shù)據(jù)來(lái)看递惋,Rust在執(zhí)行用時(shí)和內(nèi)存消耗上比Java強(qiáng)大太多。這個(gè)例子中內(nèi)存消耗的差距更明顯一些溢陪。
結(jié)語(yǔ)
如果不談Java和Rust背后的生態(tài)丹墨,僅從運(yùn)行效率本身來(lái)看。Rust作為一門更接近底層的語(yǔ)言嬉愧,性能比Java強(qiáng)也是應(yīng)該的贩挣。在內(nèi)存要求苛刻、GC時(shí)間苛刻的場(chǎng)景下不失為一個(gè)好的選擇,例如嵌入式王财、實(shí)時(shí)股票行情場(chǎng)景卵迂。能不能取代C++就看Mozila怎么搞好社區(qū)和生態(tài)圈了,以及C++程序員們是否愿意付出學(xué)習(xí)成本绒净。
我也是剛接觸Rust见咒,之后也會(huì)持續(xù)關(guān)注,希望Rust未來(lái)可期挂疆。朋友們有興趣的話可以多多交流改览,共同拓寬技術(shù)廣度與深度。
歡迎留言討論缤言。微信/知乎可搜索碼神手記同名賬號(hào)宝当,分享關(guān)注,共同進(jìn)步胆萧。