本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記,CRust of Rust是一系列持續(xù)更新的Rust中級教程。
在這篇文章中,我們將接著上一篇文章對avec!宏做性能優(yōu)化。
先看一下已經(jīng)寫好的代碼:
1#[macro_export] 2macro_rules!avec{ 3...... 4($element:expr;$count:expr)=>{{ 5letmutvs=Vec::new(); 6letx=$element; 7for_in0..$count{ 8vs.push(x.clone()); 9} 10vs 11}}; 12}
在第5行,我們創(chuàng)建了一個空的Vector,然后在第8行進(jìn)行了一堆的push操作。
假設(shè)我們有1024個元素要放入到Vector中,那就進(jìn)行了1024次push操作,就會導(dǎo)致在堆內(nèi)存上對Vector進(jìn)行多次重新分配。這是因為在 vector 增加新元素時,如果沒有足夠的空間就會要求分配大小是原內(nèi)存2倍的新內(nèi)存,并將老的元素拷貝到新的空間中,再銷毀舊內(nèi)存中的數(shù)據(jù)。
第一個需要改進(jìn)的地方是:將創(chuàng)建空Vector的語法Vec::new()改成Vec::with_capacity(count),根據(jù)count大小預(yù)先分配內(nèi)存空間,這樣就避免了一堆的內(nèi)存重新分配操作。
1#[macro_export] 2macro_rules!avec{ 3...... 4($element:expr;$count:expr)=>{{ 5letcount=$count; 6letmutvs=Vec::with_capacity(count); 7letx=$element; 8for_in0..count{ 9vs.push(x.clone()); 10} 11vs 12}}; 13}第二個需要改進(jìn)的地方是push,盡管已經(jīng)預(yù)先分配了內(nèi)存空間,但是每次執(zhí)行push操作后,指向元素的指針地址都會增長,都會進(jìn)行邊界檢查,這是不需要的。修改如下:
1#[macro_export] 2macro_rules!avec{ 3...... 4($element:expr;$count:expr)=>{{ 5letcount=$count; 6letmutvs=Vec::with_capacity(count); 7vs.extend(std::repeat($element).take(count)); 8vs 9}}; 10}
我們使用Vector的extend方法,參數(shù)需要一個iterator,我們使用了標(biāo)準(zhǔn)庫的std::repeat函數(shù),它會把element元素進(jìn)行clone。使用extend方法的好處是只會對iterator的范圍進(jìn)行一次邊界檢查,這樣就更加高效。
我們也可以使用Vector的resize方法:
1#[macro_export] 2macro_rules!avec{ 3...... 4($element:expr;$count:expr)=>{{ 5//letcount=$count; 6//letmutvs=Vec::with_capacity(count); 7//vs.extend(std::repeat($element).take(count)); 8letmutvs=Vec::new(); 9vs.resize($count,$element); 10vs 11}}; 12}至此,關(guān)于Rust的聲明宏就學(xué)習(xí)完了。
審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3109瀏覽量
75002 -
代碼
+關(guān)注
關(guān)注
30文章
4887瀏覽量
70268 -
Rust
+關(guān)注
關(guān)注
1文章
233瀏覽量
6965
原文標(biāo)題:CRust學(xué)習(xí)筆記:聲明宏-3
文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux內(nèi)核學(xué)習(xí)筆記:initcall
英飛凌TC3XX系列多核MCU學(xué)習(xí)筆記(1)

請問關(guān)于C6000系列庫中DISABLE ,DEFAULT這樣的宏是在哪個頭文件里聲明的?
MCU學(xué)習(xí)筆記相關(guān)資料分享
Altera FPGA CPLD學(xué)習(xí)筆記

MCU學(xué)習(xí)筆記_C語言基礎(chǔ)

評論