在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

最大化Rust性能:編譯器優化的比較分析

jf_wN0SrCdH ? 來源:coding到燈火闌珊 ? 2023-05-29 15:31 ? 次閱讀

Rust以其獨特的安全性、速度和并發性組合而迅速流行。但是與其它任何語言一樣,要充分利用Rust需要的不僅僅是理解它的語法和習慣用法——還需要深入了解如何有效地利用和優化它的編譯器。

為了說明這一點,我們設計了一個實際用例——一個Actix Web應用程序中的矩陣乘法任務。這種cpu密集型操作為分析各種編譯器優化提供了一個完美的場景。

隨著實驗的深入,我們將調整Cargo.toml文件的設置。利用特定的構建標志,甚至交換內存分配器。通過測量每次更改對性能的影響,我們將對Rust的編譯器優化有一個全面的了解。

實際用例

我們使用Actix Web開發了一個緊湊的應用程序,具有唯一的路由/matrix-multiplication。這個接口接收一個JSON數據,帶有一個屬性:n。

在接收到請求后,應用程序立即開始行動,動態地生成兩個大小為n x n的矩陣,在矩陣中隨機填充一些數據。然后將這些矩陣相乘在一起,將計算的結果返回給用戶。

新建一個Rust項目:

cargonewcompiler-optimizations
然后在Cargo.toml文件中寫入如下內容:
[dependencies]
anyhow="1.0.71"
actix-web="4.3.1"
dotenv="0.15.0"
serde={version="1.0",features=["derive"]}
serde_json="1.0.96"
log="0.4.17"
env_logger="0.10.0"
serde_derive="1.0.163"
rand="0.8.5"
mimalloc={version="0.1.37",default-features=false}

[profile.release]
lto=true
codegen-units=1
panic="abort"
strip=true
在src/main.rs中寫入如下代碼:
usestd::env;
userand::Rng;

useactix_web::{App,get,post,HttpResponse,HttpServer,middleware,web};
useanyhow::Result;
useserde::{Deserialize,Serialize};

#[global_allocator]
staticGLOBAL:mimalloc::MiMalloc=mimalloc::MiMalloc;

#[derive(Debug,Clone,Serialize,Deserialize)]
structMessage{
pubmessage:String,
}

#[derive(Debug,Clone,Serialize,Deserialize)]
structMatrixSize{
pubn:usize,
}

#[derive(Debug,Clone,Serialize,Deserialize)]
structMatrixResult{
pubmatrix:Vec>,
}

#[get("/healthz")]
asyncfnhealth()->HttpResponse{
HttpResponse::Ok().json(Message{
message:"healthy".to_string(),
})
}

asyncfnnot_found()->HttpResponse{
HttpResponse::NotFound().json(Message{
message:"notfound".to_string(),
})
}

#[post("/matrix-multiplication")]
asyncfnmatrix_multiplication(size:web::Json)->HttpResponse{
letn=size.n;
letmatrix_a=generate_random_matrix(n);
letmatrix_b=generate_random_matrix(n);
letresult=multiply_matrices(&matrix_a,&matrix_b);

HttpResponse::Ok().json(MatrixResult{matrix:result})
}

fngenerate_random_matrix(n:usize)->Vec>{
letmutrng=rand::thread_rng();
(0..n).map(|_|(0..n).map(|_|rng.gen_range(0..nasi32)).collect()).collect()
}

fnmultiply_matrices(matrix_a:&Vec>,matrix_b:&Vec>)->Vec>{
leta_rows=matrix_a.len();
leta_cols=matrix_a[0].len();
letb_cols=matrix_b[0].len();

letmutresult=vec![vec![0;b_cols];a_rows];

foriin0..a_rows{
forjin0..b_cols{
forkin0..a_cols{
result[i][j]+=matrix_a[i][k]*matrix_b[k][j];
}
}
}

result
}

#[actix_web::main]
asyncfnmain()->Result<()>{
env_logger::new().default_filter_or("info"));
letport=env::var("PORT").unwrap_or_else(|_|"8080".to_string());

HttpServer::new(move||{
App::new()
.wrap(middleware::default())
.service(health)
.service(matrix_multiplication)
.default_service(web::route().to(not_found))
})
.bind(format!("0.0.0.0:{}",port))?
.run()
.await.expect("failedtorunserver");

Ok(())
}

優化設置

1,Cargo.toml配置文件配置了-[profile.release]部分,用于調整優化性能。我們使用了以下優化設置:

lto = true:用于啟用鏈路時間優化;

codegen-units = 1:即在整個crate中使用最高級別優化;

panic = "abort":發生panic時調用abort而不是unwind;

strip = true:通過移除debug符號來減小二進制大小。

2,構建標識——通過設置RUSTFLAGS= " -c target-cpu=native ",我們可以確保編譯器根據機器的特定架構來優化構建。

3,備用內存分配器——我們還嘗試了mimalloc內存分配器,對于某些工作負載,它可以提供比默認分配器更好的性能特征。

測試

為了對Actix Web API進行負載測試,我們將使用一個功能強大但輕量級的工具——Drill。

為了模擬高負載,我們的測試參數將包括兩個場景中的500個并發請求——一個有10,000次迭代,另一個有20,000次迭代。這實際上分別達到了50,000和100,000個請求。

測試將在各種配置下進行,以獲得全面的性能視圖,如下所列:

1,cargo run :構建一個沒有任何優化的開發版本(標記為“D”)。

2,cargo run --release:構建一個沒有任何優化的發布版本(標記為“R”)。

3,RUSTFLAGS="-C target-cpu=native" cargo run --release:根據機器的特定架構來優化構建一個發布版本,(標記為“ROpt”)。

4,與上一個命令一樣,但是在代碼中采用了MimAlloc的內存分配器(表示為'ROptMimAlloc')。

結果

|BuildType|TotalTime(s)|Requestspersecond|
|---|---|---|
|DevBuildUnoptimized50k|71.3|701.45|
|ReleaseBuildUnoptimized50k|27.0|1849.95|
|ReleaseBuildOptimized(flags)50k|25.8|1937.80|
|ReleaseBuildOptimized(flags+mimalloc)50k|26.7|1873.65|
|ReleaseBuildUnoptimized100k|52.1|1918.27|
|ReleaseBuildOptimized(flags)100k|51.7|1934.59|
|ReleaseBuildOptimized(flags+mimalloc)100k|51.1|1955.07|

94020f4c-fdee-11ed-90ce-dac502259ad0.png

941072c6-fdee-11ed-90ce-dac502259ad0.png

從50k請求測試開始,未優化的開發構建每秒能夠處理大約701.45個請求,但是當代碼在發布模式下編譯時,每秒的請求飆升到1849.95個。這展示了Rust編譯器在從開發模式切換到發布模式時所產生的顯著差異。

使用針對本機CPU架構的構建標志添加優化,進一步提高了性能,達到每秒1937.80個請求。

當我們加入mimalloc(備用內存分配器)時,每秒請求數略微下降到1873.65。這表明,雖然mimalloc可以提高內存使用效率,但它不一定能在每個場景中都能提高請求處理速度。

轉到100k個請求測試,有趣的是,未優化版本和優化版本之間的性能差異不那么明顯。未優化的版本實現了每秒1918.27個請求,而優化的版本(帶和不帶mimalloc)分別達到了每秒1934.59和1955.07個請求。

這表明,當處理大量請求時,我們優化的影響變得不那么明顯。盡管如此,即使在更重的負載下,構建優化仍然能提供最佳性能。





原作者:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 分配器
    +關注

    關注

    0

    文章

    194

    瀏覽量

    25778
  • JSON
    +關注

    關注

    0

    文章

    119

    瀏覽量

    6981
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3015
收藏 人收藏

    評論

    相關推薦

    使用Rust優化Python性能

    在數據分析領域Python無疑是最流行的編程語言,但是Python有一個硬傷就是作為一個編譯語言在性能上有些微的欠缺。而同樣最流行的語言Rust則在
    的頭像 發表于 11-01 15:59 ?935次閱讀
    使用<b class='flag-5'>Rust</b><b class='flag-5'>優化</b>Python<b class='flag-5'>性能</b>

    性能最大化Δ-Σ 轉換

    時鐘和PGA 的調整,相同數據速率在性能方面會 有所不同。在優化數據轉換結果時,對于這些方方面面做到完全了解并非易事。另外一些問題還包 括輸入阻抗、濾波響應、抗混疊,以及長期漂移。性能
    發表于 10-21 11:24

    如何使應用程序開機運行最大化

    我現在生成一個應用程序并開機啟動了,但是如何啊能讓他啟動是最大化顯示呢現在一開機啟動不是最大化啊。。。。。。很苦惱啊,希望大家指點
    發表于 05-11 20:57

    怎樣去實現OTDR/iOLM長期性能最大化

    怎樣去實現OTDR/iOLM長期性能最大化
    發表于 05-24 07:15

    SIMD計算機的優化編譯器設計

    利用處理的相關資源,提高編譯器優化性能和增強代碼可適應性是SIMD處理優化編譯的關鍵。該文基
    發表于 04-03 08:47 ?30次下載

    最大化自動化測試系統的精度

    最大化自動化測試系統的精度 引言 在設計自動化測試系統時,精度的最大化通常是關鍵的考慮因素。確定如何最大化精度總是很困難
    發表于 06-13 15:02 ?720次閱讀
    <b class='flag-5'>最大化</b>自動化測試系統的精度

    編譯器_keil的優化選項問題

    keil編譯器優化選項針對ARM,對STM32編譯的一些優化的問題
    發表于 02-25 14:18 ?3次下載

    編譯器優化對函數的影響

    編譯器如gcc,可以指定不同的優化參數,在某些條件下,有些函數可能會被優化掉。
    的頭像 發表于 06-22 14:58 ?2849次閱讀
    <b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>對函數的影響

    基于互信息最大化的Raptor碼優化設計方法

    基于互信息最大化的Raptor碼優化設計方法
    發表于 07-02 11:47 ?8次下載

    最大化Rust性能編譯器優化比較分析

    Rust以其獨特的安全性、速度和并發性組合而迅速流行。但是與其它任何語言一樣,要充分利用Rust需要的不僅僅是理解它的語法和習慣用法——還需要深入了解如何有效地利用和優化它的編譯器
    的頭像 發表于 05-29 16:17 ?2014次閱讀
    <b class='flag-5'>最大化</b><b class='flag-5'>Rust</b><b class='flag-5'>性能</b>:<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>比較</b><b class='flag-5'>分析</b>

    編譯器優化選項

    一個程序首先要保證正確性,在保證正確性的基礎上,性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數據結構;第二,應該編寫編譯器能夠有效優化以轉換成高效可執行代碼的
    的頭像 發表于 11-24 15:37 ?926次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優化</b>選項

    TVM編譯器的整體架構和基本方法

    。但是這其中也去思考了一下基于FPGA加速編譯器架構。在FPGA深度學習加速中,編譯器除了需要自動化生成指令外,還要優化指令的結構,來
    的頭像 發表于 11-30 09:36 ?2476次閱讀
    TVM<b class='flag-5'>編譯器</b>的整體架構和基本方法

    Triton編譯器與其他編譯器比較

    Triton編譯器與其他編譯器比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的
    的頭像 發表于 12-24 17:25 ?392次閱讀

    Triton編譯器的優勢與劣勢分析

    Triton編譯器作為一種新興的深度學習編譯器,具有一系列顯著的優勢,同時也存在一些潛在的劣勢。以下是對Triton編譯器優勢與劣勢的分析: 優勢 高效
    的頭像 發表于 12-25 09:07 ?282次閱讀

    Triton編譯器優化技巧

    在現代計算環境中,編譯器性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的
    的頭像 發表于 12-25 09:09 ?247次閱讀
    主站蜘蛛池模板: 色爽女视频| 嫩草影院在线入口| 一级日本大片免费观看视频| 中文字幕日本一区波多野不卡| 在线天堂bt中文www在线| 亚洲国产精品嫩草影院| 婷婷综合在线观看丁香| 日韩三级在线免费观看| 欧美三级大片在线观看| 精品伊人久久大线蕉色首页| 国产片91人成在线观看| 夜夜摸天天操| 免费又爽又黄1000禁片| 99热99操99射| 亚欧毛片基地国产毛片基地| 中文三级视频| 色窝视频| 精品国产香港三级| 亚洲黄色录像| 国产精品久久久久久福利| 91在线免费观看网站| 狠狠狠色丁香婷婷综合激情 | 伊人久久影视| 人人干天天干| 免费免费啪视频视频观看| 免费看男女下面日出水视频| 亚洲大尺度视频| 欧美色图亚洲激情| 国产成在线人视频免费视频| 香蕉午夜视频| 2018天天干天天射| 激情五月激情综合色区| 天堂资源在线中文| 精品伊人久久大线蕉地址| 亚洲成a人片在线看| 99精品视频在线播放2| 白嫩少妇激情无码| 日本三级午夜| se在线播放| 99精品在免费线视频| 综合网在线|