Golang高效地拷貝big.Int

錯(cuò)誤的方式

試圖通過拷貝*big.Int指針?biāo)傅慕Y(jié)構(gòu):

a := big.NewInt(10)
b := new(big.Int)
*b = *a

這種方式是錯(cuò)誤的,因?yàn)?code>big.Int結(jié)構(gòu)內(nèi)部有slice闰非,拷貝結(jié)構(gòu)的話內(nèi)部的slice仍然是共享內(nèi)存膘格。

點(diǎn)擊運(yùn)行測(cè)試

正確的方式

1.拷貝Bytes

思想:

序列化成[]bytes,然后拷貝

func BenchmarkBigIntCopyBytes(b *testing.B) {
    b.ReportAllocs()

    old, _ := new(big.Int).SetString("100000000222222222222222222220000000000000000000", 10)
    new := new(big.Int)
    for i := 0; i < b.N; i++ {
        new.SetBytes(old.Bytes())
    }
}

2.反射賦值

思想:

通過反射賦值

func BenchmarkBigIntCopier(b *testing.B) {
    b.ReportAllocs()

    old, _ := new(big.Int).SetString("100000000222222222222222222220000000000000000000", 10)
    new := new(big.Int)
    for i := 0; i < b.N; i++ {
        // "github.com/jinzhu/copier"
        copier.Copy(new, old)
    }

}

copier內(nèi)部實(shí)現(xiàn)使用了reflect财松。

3. +0

思想

new = old = old + 0

func TestCopyByAdd(t *testing.T) {
    old, _ := new(big.Int).SetString("100000000222222222222222222220000000000000000000", 10)

    new := new(big.Int)
    // new = old = old + 0
    new.Add(old, new)
    if old.Cmp(new) != 0 {
        t.FailNow()
    }

    new.Add(new, big.NewInt(1))
    t.Logf("old:%v,new:%v", old, new)
    if old.Cmp(new) >= 0 {
        t.FailNow()
    }
}

Benchmark測(cè)試

func BenchmarkBigIntCopyByAdd(b *testing.B) {
    b.ReportAllocs()

    old, _ := new(big.Int).SetString("100000000222222222222222222220000000000000000000", 10)
    new := new(big.Int)
    for i := 0; i < b.N; i++ {
        // new = old = old + 0
        new.Add(old, new)
    }
}

性能對(duì)比

big.Int = 10

BenchmarkBigIntCopier-8     30000000            62.5 ns/op         0 B/op          0 allocs/op
BenchmarkBigIntCopyBytes-8      30000000            46.7 ns/op         8 B/op          1 allocs/op
BenchmarkBigIntCopyByAdd-8      100000000           20.8 ns/op         0 B/op          0 allocs/op

big.Int = 100000000222222222222222222220000000000000000000

BenchmarkBigIntCopier-8     30000000            60.8 ns/op         0 B/op          0 allocs/op
BenchmarkBigIntCopyBytes-8      20000000            69.1 ns/op        32 B/op          1 allocs/op
BenchmarkBigIntCopyByAdd-8      100000000           22.1 ns/op         0 B/op          0 allocs/op

比較兩次運(yùn)行的結(jié)果瘪贱,發(fā)現(xiàn):

  • BenchmarkBigIntCopyBytes有額外的內(nèi)存分配,其它兩個(gè)方法則沒有
  • 當(dāng)big.Int值變大時(shí)游岳,BenchmarkBigIntCopyBytes分配的內(nèi)存增加政敢,性能變差其徙,結(jié)果BenchmarkBigIntCopier接近胚迫,甚至還差一點(diǎn)
  • BenchmarkBigIntCopyByAdd是性能最好的,沒有額外的內(nèi)存分配唾那,且耗時(shí)穩(wěn)定

結(jié)論

+ 0 是最好的選擇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末访锻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闹获,更是在濱河造成了極大的恐慌期犬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件避诽,死亡現(xiàn)場(chǎng)離奇詭異龟虎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沙庐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鲤妥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佳吞,“玉大人,你說我怎么就攤上這事棉安〉装猓” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵贡耽,是天一觀的道長(zhǎng)衷模。 經(jīng)常有香客問我,道長(zhǎng)蒲赂,這世上最難降的妖魔是什么阱冶? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮滥嘴,結(jié)果婚禮上熙揍,老公的妹妹穿的比我還像新娘。我一直安慰自己氏涩,他們只是感情好届囚,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是尖,像睡著了一般意系。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饺汹,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天蛔添,我揣著相機(jī)與錄音,去河邊找鬼兜辞。 笑死迎瞧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逸吵。 我是一名探鬼主播凶硅,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扫皱!你這毒婦竟也來了足绅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤韩脑,失蹤者是張志新(化名)和其女友劉穎氢妈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體段多,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡首量,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加缘。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粥航,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出生百,到底是詐尸還是另有隱情递雀,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布蚀浆,位于F島的核電站缀程,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏市俊。R本人自食惡果不足惜杨凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摆昧。 院中可真熱鬧撩满,春花似錦、人聲如沸绅你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忌锯。三九已至伪嫁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偶垮,已是汗流浹背张咳。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留似舵,地道東北人脚猾。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像砚哗,于是被迫代替她去往敵國(guó)和親龙助。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,157評(píng)論 1 5
  • 從三月份找實(shí)習(xí)到現(xiàn)在频祝,面了一些公司泌参,掛了不少,但最終還是拿到小米常空、百度、阿里盖溺、京東漓糙、新浪、CVTE烘嘱、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,280評(píng)論 11 349
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,168評(píng)論 30 470
  • 故鄉(xiāng)的小河 是記憶中轉(zhuǎn)動(dòng)的風(fēng)車 洋溢著歡樂 這洋溢著歡樂的小河 故鄉(xiāng)的小河 是泥巴捏成的信鴿 傳遞著思念 這傳遞著...
    喜禾丹閱讀 259評(píng)論 5 3
  • 關(guān)于人際邊界的感悟昆禽,實(shí)在是很多很多蝗蛙,于是乎整理出來,發(fā)表出來醉鳖,大約會(huì)有不少于六篇捡硅。有興趣的朋友可以持續(xù)關(guān)注頭條號(hào)“...
    黃衣心理王靜閱讀 1,309評(píng)論 0 3