0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何編寫高性能的Rust代碼

jf_wN0SrCdH ? 來(lái)源: coding到燈火闌珊 ? 2023-11-03 14:28 ? 次閱讀

為了最大限度地提高Rust應(yīng)用程序的性能,你需要了解支持代碼的底層硬件架構(gòu),如何優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu),以及如何對(duì)代碼進(jìn)行配置和基準(zhǔn)測(cè)試。在本文中,我們將簡(jiǎn)要介紹這些主題,希望能更好地理解如何編寫高性能的Rust代碼。

了解硬件架構(gòu)

為了開始編寫更高效的Rust代碼,首先應(yīng)該對(duì)機(jī)器的底層硬件架構(gòu)有一個(gè)基本的了解,包括CPU、內(nèi)存層次結(jié)構(gòu)和緩存。理解這些概念可以幫助你在如何構(gòu)建代碼和數(shù)據(jù)方面做出更明智的決策,從而能夠充分利用硬件的功能。

CPU

CPU是計(jì)算機(jī)的處理引擎,它執(zhí)行指令并進(jìn)行計(jì)算,使其成為性能方面最重要的組件之一。CPU由多個(gè)核心組成,每個(gè)核心都能獨(dú)立執(zhí)行指令。為了充分利用這些核心,編寫利用并行性同時(shí)執(zhí)行多個(gè)線程的代碼非常重要。

假設(shè)我們有一大堆需要調(diào)整大小的圖片,如果我們按順序處理,將花費(fèi)很長(zhǎng)時(shí)間,因?yàn)槊看蔚急仨毜却耙粋€(gè)迭代完成。

fnresize_images_sequentially(){
//加載一個(gè)圖像集合
letimages=vec![
"image1.png",
"image2.png",
"image3.png",
...
];

forimage_pathinimages{
//從磁盤加載圖像
letimg=image::open(image_path).expect("Failedtoopentheimage");

//調(diào)整圖像大小
letresized_img=resize_image(img);

//將調(diào)整大小的圖像保存到磁盤
letoutput_path=format!("resized_{}",image_path);
resized_img.save(output_path).expect("Failedtosavetheresizedimage");
}
}
使用并行性,我們可以將調(diào)整大小的任務(wù)分配到多個(gè)cpu內(nèi)核,從而允許我們同時(shí)處理多個(gè)圖像。Rust的標(biāo)準(zhǔn)庫(kù)包含了有用的多線程特性,所以我們可以以一種內(nèi)存安全的方式輕松實(shí)現(xiàn)多線程:
fnresize_images_in_parallel(){
//加載一個(gè)圖像集合
letimages=vec![
"image1.png",
"image2.png",
"image3.png",
...
];

letmuthandles=vec![];

forimage_pathinimages{
//為每個(gè)圖像處理任務(wù)生成一個(gè)新線程
handles.push(thread::spawn(move||{
//從磁盤加載圖像
letimg=image::open(image_path).expect("Failedtoopentheimage");

//調(diào)整圖像大小
letresized_img=resize_image(img);

//將調(diào)整大小的圖像保存到磁盤
letoutput_path=format!("resized_{}",image_path);
resized_img.save(output_path).expect("Failedtosavetheresizedimage");
}));
}

//等待所有線程完成
forhandleinhandles{
handle.join().unwrap();
}
}

并行性和并發(fā)性可以顯著提高代碼的速度。

內(nèi)存層次結(jié)構(gòu)

內(nèi)存層次結(jié)構(gòu)是指計(jì)算機(jī)系統(tǒng)中不同級(jí)別的內(nèi)存,從快速但較小的緩存到較慢但較大的主內(nèi)存。

532036be-7997-11ee-939d-92fbcf53809c.png

在編寫高效的Rust代碼時(shí),重要的是通過(guò)以最大化空間局部性(訪問(wèn)附近的內(nèi)存位置)和時(shí)間局部性(重用最近訪問(wèn)的數(shù)據(jù))的方式組織數(shù)據(jù)來(lái)最小化緩存丟失。

這方面的一個(gè)簡(jiǎn)單示例是使用結(jié)構(gòu)將相關(guān)數(shù)據(jù)分組在一起,這可以改善空間局部性,因?yàn)榻Y(jié)構(gòu)元素更可能彼此靠近,從而減少緩存丟失。而不是做這樣的事情:

letx=1;
lety=2;
letz=3;

//dosomethingwithx,y,andz
你可以在一個(gè)struct中聲明變量:
structXYZ{
x:i32,
y:i32,
z:i32,
}

letxyz=XYZ{x:1,y:2,z:3};

//dosomethingwithxyz.x,xyz.y,andxyz.z

這樣就會(huì)以更加緩存友好的方式訪問(wèn)變量,從而改進(jìn)空間局部性并減少緩存丟失。請(qǐng)記住,只有當(dāng)它對(duì)程序有意義時(shí),才應(yīng)該使用這種技術(shù)。如果不需要一起訪問(wèn)這些變量,那么將它們聲明到一個(gè)結(jié)構(gòu)體中就沒(méi)有意義了。

另一種技術(shù)是盡可能使用切片而不是鏈表或其他動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),切片提供了更好的空間局部性,因?yàn)樵卦趦?nèi)存中彼此相鄰存儲(chǔ),因此訪問(wèn)它們通常更快。

例如,考慮一個(gè)需要遍歷整數(shù)集合的程序。

letmutlist=LinkedList::new();
list.push_back(1);
list.push_back(2);
list.push_back(3);

foriteminlist{
//dosomethingwithitem
}
這里不應(yīng)該使用鏈表,可以使用一個(gè)靜態(tài)大小的切片:
letarray=[1,2,3];

foritemin&array{
//dosomethingwithitem
}

通過(guò)在這里使用片,可以訪問(wèn)內(nèi)存中的相鄰元素,從而提高空間局部性并減少緩存丟失。如果使用了鏈表,則元素可能分散在整個(gè)內(nèi)存中,可能導(dǎo)致更多的緩存丟失和更慢的處理時(shí)間。

總的來(lái)說(shuō),理解內(nèi)存層次結(jié)構(gòu)并相應(yīng)地優(yōu)化代碼可以顯著提高性能。通過(guò)注意如何使用和訪問(wèn)內(nèi)存中的數(shù)據(jù),可以毫不費(fèi)力地改進(jìn)代碼。

緩存

如前所述,緩存是一種很小但速度極快的內(nèi)存類型,它充當(dāng)CPU和主內(nèi)存之間的緩沖區(qū),允許更快地訪問(wèn)存儲(chǔ)在其寄存器中的數(shù)據(jù)。

優(yōu)化緩存行為的一種方法是使用具有良好緩存局部性的數(shù)據(jù)結(jié)構(gòu)。如前所述,切片是一個(gè)很好的選擇,因?yàn)樗鼈冊(cè)趦?nèi)存中相鄰地存儲(chǔ)元素。這意味著訪問(wèn)切片中的元素更有可能導(dǎo)致緩存命中,這可以極大地提高效率。

另一種技術(shù)是使用專為緩存效率而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu),例如packed_simd crate。打包SIMD(單指令,多數(shù)據(jù))允許同時(shí)對(duì)多個(gè)值執(zhí)行計(jì)算,這可以大大提高性能。通過(guò)利用打包的SIMD指令,可以用更少的指令處理大量數(shù)據(jù),并減少內(nèi)存訪問(wèn)。

在下兩篇文章中,我們將討論代碼的分析和基準(zhǔn)測(cè)試,算法和數(shù)據(jù)結(jié)構(gòu)的優(yōu)化,內(nèi)存優(yōu)化及構(gòu)建配置。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10768

    瀏覽量

    210418
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68075
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3221

    瀏覽量

    57499
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6524

原文標(biāo)題:最大化Rust代碼的性能 - 1 了解硬件架構(gòu)

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何在Rust中使用Memcached

    Memcached是一種高性能、分布式的內(nèi)存對(duì)象緩存系統(tǒng),可用于加速動(dòng)態(tài)Web應(yīng)用程序。Rust是一種系統(tǒng)級(jí)編程語(yǔ)言,具有內(nèi)存安全、高性能和并發(fā)性等特點(diǎn)。Rust語(yǔ)言的Memcache
    的頭像 發(fā)表于 09-19 16:30 ?1142次閱讀

    Rust語(yǔ)言如何與 InfluxDB 集成

    Rust 是一種系統(tǒng)級(jí)編程語(yǔ)言,具有高性能和內(nèi)存安全性。InfluxDB 是一個(gè)開源的時(shí)間序列數(shù)據(jù)庫(kù),用于存儲(chǔ)、查詢和可視化大規(guī)模數(shù)據(jù)集。Rust 語(yǔ)言可以與 InfluxDB 集成,提供高效
    的頭像 發(fā)表于 09-30 16:45 ?1026次閱讀

    Rust的 match 語(yǔ)句用法

    Rust 是一門現(xiàn)代化的系統(tǒng)編程語(yǔ)言,它擁有高性能、內(nèi)存安全和并發(fā)性等特點(diǎn)。Rust 的語(yǔ)法設(shè)計(jì)非常優(yōu)秀,其中 match 語(yǔ)句是一種非常強(qiáng)大的語(yǔ)言特性。match 語(yǔ)句可以讓我們根據(jù)不同的匹配模式
    的頭像 發(fā)表于 09-19 17:08 ?843次閱讀

    Rust的多線程編程概念和使用方法

    Rust是一種強(qiáng)類型、高性能的系統(tǒng)編程語(yǔ)言,其官方文檔中強(qiáng)調(diào)了Rust的標(biāo)準(zhǔn)庫(kù)具有良好的并發(fā)編程支持。Thread是Rust中的一種并發(fā)編程方式,本文將介紹
    的頭像 發(fā)表于 09-20 11:15 ?877次閱讀

    使用Rust優(yōu)化Python性能

    在數(shù)據(jù)分析領(lǐng)域Python無(wú)疑是最流行的編程語(yǔ)言,但是Python有一個(gè)硬傷就是作為一個(gè)編譯語(yǔ)言在性能上有些微的欠缺。而同樣最流行的語(yǔ)言Rust則在性能方面表現(xiàn)優(yōu)秀。本文我們一起學(xué)習(xí)一個(gè)優(yōu)化項(xiàng)目的實(shí)踐,對(duì)一個(gè)數(shù)據(jù)分析程序,改為
    的頭像 發(fā)表于 11-01 15:59 ?796次閱讀
    使用<b class='flag-5'>Rust</b>優(yōu)化Python<b class='flag-5'>性能</b>

    怎樣去使用Rust進(jìn)行嵌入式編程呢

    使用Rust進(jìn)行嵌入式編程Use Rust for embedded development篇首語(yǔ):Rust高性能、可靠性和生產(chǎn)力使其適合于嵌入式系統(tǒng)。在過(guò)去的幾年里,
    發(fā)表于 12-22 07:20

    RUST在嵌入式開發(fā)中的應(yīng)用是什么

    Rust是一種編程語(yǔ)言,它使用戶能夠構(gòu)建可靠、高效的軟件,尤其是用于嵌入式開發(fā)的軟件。它的特點(diǎn)是:高性能Rust具有驚人的速度和高內(nèi)存利用率??煽啃裕涸诰幾g過(guò)程中可以消除內(nèi)存錯(cuò)誤。生產(chǎn)效率:優(yōu)秀
    發(fā)表于 12-24 08:34

    Rust代碼中加載靜態(tài)庫(kù)時(shí),出現(xiàn)錯(cuò)誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    “ [i]malloc ”、“ [i]exit ”。我驗(yàn)證了使用 ` [i]nm ` 命令。 問(wèn)題是我打算使用 ffi 在 rust 中使用這個(gè)靜態(tài)庫(kù)。當(dāng)我嘗試在我的 Rust 代碼中加載靜態(tài)庫(kù)
    發(fā)表于 06-09 08:44

    Cloudflare使用Rust編寫Pingora

    Cloudflare長(zhǎng)期以來(lái)一直依賴Nginx作為其HTTP代理?xiàng)5囊徊糠?,但現(xiàn)在已經(jīng)用他們內(nèi)部的、由Rust編寫的Pingora軟件取代了它,據(jù)說(shuō)該軟件每天為超過(guò)一萬(wàn)億個(gè)請(qǐng)求提供服務(wù),并提供更好的性能,同時(shí)只使用大約三分之一的
    的頭像 發(fā)表于 09-19 10:26 ?1827次閱讀

    如何在同步的Rust方法中調(diào)用異步代碼呢?

    在同步的 Rust 方法中調(diào)用異步代碼經(jīng)常會(huì)導(dǎo)致一些問(wèn)題,特別是對(duì)于不熟悉異步 Rust runtime 底層原理的初學(xué)者。
    的頭像 發(fā)表于 03-17 09:18 ?1982次閱讀

    Rust的內(nèi)部工作原理

    Rust到匯編:了解 Rust 的內(nèi)部工作原理 非常好的Rust系列文章,通過(guò)生成的匯編代碼,讓你了解很多Rust內(nèi)部的工作機(jī)制。例如文章有
    的頭像 發(fā)表于 06-14 10:34 ?711次閱讀
    <b class='flag-5'>Rust</b>的內(nèi)部工作原理

    使用C++編寫通用庫(kù)并在 Rust 中使用它 (WASI)

    使用 C++ 編寫通用庫(kù)并在 Rust 中使用它 (WASI) WebAssembly 簡(jiǎn)介 WebAssembly 是一種二進(jìn)制指令格式,旨在成為一種低級(jí)虛擬機(jī),可以在 Web 瀏覽器中以接近本機(jī)
    的頭像 發(fā)表于 06-16 10:03 ?972次閱讀
    使用C++<b class='flag-5'>編寫</b>通用庫(kù)并在 <b class='flag-5'>Rust</b> 中使用它 (WASI)

    Rust開源社區(qū)推出龍架構(gòu)原生適配版本

    應(yīng)用程序時(shí)具有優(yōu)良的并發(fā)性能,其高性能特性使Rust適用于編寫高效的系統(tǒng)軟件,如操作系統(tǒng)內(nèi)核、嵌入式設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)服務(wù)器。
    的頭像 發(fā)表于 07-17 16:54 ?436次閱讀
    <b class='flag-5'>Rust</b>開源社區(qū)推出龍架構(gòu)原生適配版本

    FastTime-純Rust編寫的高并發(fā)快速時(shí)間庫(kù)

    FastTime, 純Rust編寫的快速時(shí)間庫(kù), 并發(fā): 2800萬(wàn)+/秒. 一、組件
    的頭像 發(fā)表于 11-06 09:23 ?555次閱讀

    [鴻蒙]OpenHarmony4.0的Rust開發(fā)

    背景 Rust 是一門靜態(tài)強(qiáng)類型語(yǔ)言,具有更安全的內(nèi)存管理、更好的運(yùn)行性能、原生支持多線程開發(fā)等優(yōu)勢(shì)。Rust 官方也使用 Cargo 工具來(lái)專門為 Rust
    的頭像 發(fā)表于 02-26 17:28 ?731次閱讀
    [鴻蒙]OpenHarmony4.0的<b class='flag-5'>Rust</b>開發(fā)