本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記,CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
在這篇文章中,我們將接著上一篇文章對(duì)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)建了一個(gè)空的Vector,然后在第8行進(jìn)行了一堆的push操作。
假設(shè)我們有1024個(gè)元素要放入到Vector中,那就進(jìn)行了1024次push操作,就會(huì)導(dǎo)致在堆內(nèi)存上對(duì)Vector進(jìn)行多次重新分配。這是因?yàn)樵?vector 增加新元素時(shí),如果沒(méi)有足夠的空間就會(huì)要求分配大小是原內(nèi)存2倍的新內(nèi)存,并將老的元素拷貝到新的空間中,再銷毀舊內(nèi)存中的數(shù)據(jù)。
第一個(gè)需要改進(jìn)的地方是:將創(chuàng)建空Vector的語(yǔ)法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}第二個(gè)需要改進(jìn)的地方是push,盡管已經(jīng)預(yù)先分配了內(nèi)存空間,但是每次執(zhí)行push操作后,指向元素的指針地址都會(huì)增長(zhǎng),都會(huì)進(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ù)需要一個(gè)iterator,我們使用了標(biāo)準(zhǔn)庫(kù)的std::repeat函數(shù),它會(huì)把element元素進(jìn)行clone。使用extend方法的好處是只會(huì)對(duì)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文章
3040瀏覽量
74172 -
代碼
+關(guān)注
關(guān)注
30文章
4808瀏覽量
68812 -
Rust
+關(guān)注
關(guān)注
1文章
229瀏覽量
6626
原文標(biāo)題:CRust學(xué)習(xí)筆記:聲明宏-3
文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論