最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言關(guān)于幾種深度拷貝(deepcopy)方法的性能對比

 更新時(shí)間:2024年01月19日 09:43:18   作者:pengpengzhou  
這篇文章主要介紹了Go語言關(guān)于幾種深度拷貝(deepcopy)方法的性能對比,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

幾種深度拷貝(deepcopy)方法性能對比

Go語言中所有賦值操作都是值傳遞,如果結(jié)構(gòu)中不含指針,則直接賦值就是深度拷貝;如果結(jié)構(gòu)中含有指針(包括自定義指針,以及切片,map等使用了指針的內(nèi)置類型),則數(shù)據(jù)源和拷貝之間對應(yīng)指針會共同指向同一塊內(nèi)存,這時(shí)深度拷貝需要特別處理。

目前有三種方法

  • 一是用gob序列化成字節(jié)序列再反序列化生成克隆對象
  • 二是先轉(zhuǎn)換成json字節(jié)序列,再解析字節(jié)序列生成克隆對象
  • 三是針對具體情況,定制化拷貝

前兩種方法雖然比較通用但是因?yàn)槭褂昧藃eflex反射,性能比定制化拷貝要低出2個(gè)數(shù)量級,所以在性能要求較高的情況下應(yīng)該盡量避免使用前兩者。

結(jié)論數(shù)據(jù)

執(zhí)行一次的時(shí)間

gob time:454µs
json time:170µs
custom time:2µs

測試代碼如下:

package main
 
import (
	"bytes"
	"encoding/gob"
	"encoding/json"
	"fmt"
	"time"
)
 
type AuthorInfo struct {
	Name    string `json:name`
	Age     int    `json:age`
	Country *int   `json:country`
}
 
type Book struct {
	Title    string            `json:title`
	Author   AuthorInfo        `json:author`
	Year     int               `json:year`
	Category []string          `json:category`
	Price    map[string]string `json:price`
}
 
func DeepCopyByGob(dst, src interface{}) error {
	var buffer bytes.Buffer
	if err := gob.NewEncoder(&buffer).Encode(src); err != nil {
		return err
	}
 
	return gob.NewDecoder(&buffer).Decode(dst)
}
 
func DeepCopyByJson(src []Book) (*[]Book, error) {
	var dst = new([]Book)
	b, err := json.Marshal(src)
	if err != nil {
		return nil, err
	}
 
	err = json.Unmarshal(b, dst)
	return dst, err
}
 
func DeepCopyByCustom(src []Book) []Book {
	dst := make([]Book, len(src))
	for i, book := range src {
		tmpbook := Book{}
		tmpbook.Title = book.Title
		tmpbook.Year = book.Year
		tmpbook.Author = AuthorInfo{}
		tmpbook.Author.Name = book.Author.Name
		tmpbook.Author.Age = book.Author.Age
		tmpbook.Author.Country = new(int)
		*tmpbook.Author.Country = *book.Author.Country
		tmpbook.Category = make([]string, len(book.Category))
		for index, category := range book.Category {
			tmpbook.Category[index] = category
		}
		tmpbook.Price = make(map[string]string)
		for k, v := range book.Price {
			tmpbook.Price[k] = v
		}
		dst[i] = tmpbook
	}
	return dst
}
 
func check(err error){
	if err != nil{
		panic(err)
	}
}
 
func print(name string, books []Book){
	for index,book := range books{
		fmt.Printf("%s[%d]=%v country=%d\n", name, index, book, *book.Author.Country)
	}
}
 
func main() {
	//初始化源Book切片
	books := make([]Book, 1)
	country := 1156
	author := AuthorInfo{"David", 38, &country}
	price := make(map[string]string)
	price["Europe"] = "$56"
	books[0] = Book{"Tutorial", author, 2020, []string{"math", "art"}, price}
	print("books",books)
 
	var err error
	var start time.Time
 
	//Gob拷貝
	start = time.Now()
	booksCpy := make([]Book, 1)
	err = DeepCopyByGob(&booksCpy, books)
	fmt.Printf("\ngob time:%v\n", time.Now().Sub(start))
	check(err)
	*booksCpy[0].Author.Country = 1134
	booksCpy[0].Category[0] = "literature"
	booksCpy[0].Price["America"] = "$250"
	print("booksCpy",booksCpy)
	print("books",books)
 
	//JSON拷貝
	start = time.Now()
	booksCpy2, err_json := DeepCopyByJson(books)
	fmt.Printf("\njson time:%v\n", time.Now().Sub(start))
	check(err_json)
	*(*booksCpy2)[0].Author.Country = 1135
	(*booksCpy2)[0].Category[0] = "science"
	(*booksCpy2)[0].Price["Canada"] = "$150"
	print("(*booksCpy2)",*booksCpy2)
	print("books",books)
 
	//定制拷貝
	start = time.Now()
	booksCpy3 := DeepCopyByCustom(books)
	fmt.Printf("\ncustom time:%v\n", time.Now().Sub(start))
	*booksCpy3[0].Author.Country = 1136
	booksCpy3[0].Category[0] = "geometry"
	booksCpy3[0].Price["Africa"] = "$34"
	print("booksCpy3",booksCpy3)
	print("books",books)
}

運(yùn)行輸出:

books[0]={Tutorial {David 38 0xc000016178} 2020 [math art] map[Europe:$56]} country=1156
 
gob time:454.117µs
booksCpy[0]={Tutorial {David 38 0xc0000165d8} 2020 [literature art] map[America:$250 Europe:$56]} country=1134
books[0]={Tutorial {David 38 0xc000016178} 2020 [math art] map[Europe:$56]} country=1156
 
json time:170.338µs
(*booksCpy2)[0]={Tutorial {David 38 0xc000016878} 2020 [science art] map[Canada:$150 Europe:$56]} country=1135
books[0]={Tutorial {David 38 0xc000016178} 2020 [math art] map[Europe:$56]} country=1156
 
custom time:2.165µs
booksCpy3[0]={Tutorial {David 38 0xc0000168c8} 2020 [geometry art] map[Africa:$34 Europe:$56]} country=1136
books[0]={Tutorial {David 38 0xc000016178} 2020 [math art] map[Europe:$56]} country=1156

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang中defer的基本使用教程

    golang中defer的基本使用教程

    go語言中defer可以完成延遲功能,當(dāng)前函數(shù)執(zhí)行完成后再執(zhí)行defer的代碼塊,下面這篇文章主要給大家介紹了關(guān)于golang中defer基本使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 淺談golang的http cookie用法

    淺談golang的http cookie用法

    本篇文章主要介紹了golang的http cookie用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Go語言驅(qū)動低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)

    Go語言驅(qū)動低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)

    這篇文章主要為大家介紹了Go語言驅(qū)動低代碼應(yīng)用引擎工具Yao開發(fā)管理系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang泛型的使用方法詳解

    Golang泛型的使用方法詳解

    這篇文章主要介紹了Golang中泛型的使用,Go和Python語言不同,處理不同數(shù)據(jù)類型非常嚴(yán)格。如Python可以定義函數(shù)帶兩個(gè)數(shù)值類型并返回較大的數(shù)值,但可以不嚴(yán)格指定參數(shù)類型為float或integer
    2022-12-12
  • 十個(gè)示例帶你深入了解Go語言中的接口

    十個(gè)示例帶你深入了解Go語言中的接口

    這篇文章主要是通過十個(gè)簡單的示例帶大家深入了解一下Go語言中接口的使用,文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的可以了解一下
    2023-02-02
  • Golang時(shí)間處理中容易踩的坑分析解決

    Golang時(shí)間處理中容易踩的坑分析解決

    這篇文章主要為大家介紹了Golang時(shí)間處理中容易踩的坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 淺談go中cgo的幾種使用方式

    淺談go中cgo的幾種使用方式

    本文主要介紹了淺談go中cgo的幾種使用方式,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Golang實(shí)現(xiàn)秒讀32GB大文件示例步驟

    Golang實(shí)現(xiàn)秒讀32GB大文件示例步驟

    這篇文章主要為大家介紹了Golang實(shí)現(xiàn)秒讀32GB大文件的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 一文詳解Golang的模塊版本管理與語義版本控制

    一文詳解Golang的模塊版本管理與語義版本控制

    在Golang中,模塊(module)是Go 1.11版本引入的依賴管理系統(tǒng),幫助開發(fā)者管理項(xiàng)目的依賴,在Go模塊推出之前,開發(fā)者通常使用GOPATH和vendor目錄來管理項(xiàng)目的依賴,本文將給大家詳細(xì)介紹Golang的模塊版本管理與語義版本控制,需要的朋友可以參考下
    2023-12-12
  • Go語言共享內(nèi)存讀寫實(shí)例分析

    Go語言共享內(nèi)存讀寫實(shí)例分析

    這篇文章主要介紹了Go語言共享內(nèi)存讀寫方法,實(shí)例分析了共享內(nèi)存的原理與讀寫技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評論

大冶市| 河北省| 利川市| 安岳县| 咸宁市| 徐汇区| 凤凰县| 祁连县| 突泉县| 焦作市| 远安县| 织金县| 嘉峪关市| 梧州市| 荔浦县| 博白县| 成都市| 赞皇县| 湟源县| 宜州市| 阳信县| 武陟县| 土默特右旗| 巴彦淖尔市| 翁源县| 南靖县| 北安市| 米脂县| 双鸭山市| 靖远县| 枣阳市| 台北县| 蕲春县| 白朗县| 杭锦旗| 定远县| 五指山市| 石家庄市| 中西区| 潼南县| 安新县|