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

三種Golang數(shù)組拷貝方式及性能分析詳解

 更新時間:2022年08月24日 10:13:47   作者:jiaxwu  
在Go語言中,我們可以使用for、append()和copy()進行數(shù)組拷貝。這篇文章主要為大家詳細介紹一下這三種方式的具體實現(xiàn)與性能分析,需要的可以參考一下

在Go語言中,我們可以使用for、append()copy()進行數(shù)組拷貝,對于某些對性能比較敏感且數(shù)組拷貝比較多的場景,我們可以會對拷貝性能比較關(guān)注,這篇文件主要是對比一下這三種方式的性能。

測試

測試條件是把一個64KB的字節(jié)數(shù)組分為64個塊進行復制。

測試代碼

package test

import (
	"testing"
)

const (
	blocks    = 64
	blockSize = 1024
)

var block = make([]byte, blockSize)

func BenchmarkFori(b *testing.B) {
	a := make([]byte, blocks*blockSize)
	for n := 0; n < b.N; n++ {
		for i := 0; i < blocks; i++ {
			for j := 0; j < blockSize; j++ {
				a[i*blockSize+j] = block[j]
			}
		}
	}
}

func BenchmarkAppend(b *testing.B) {
	a := make([]byte, 0, blocks*blockSize)
	for n := 0; n < b.N; n++ {
		a = a[:0]
		for i := 0; i < blocks; i++ {
			a = append(a, block...)
		}
	}
}

func BenchmarkCopy(b *testing.B) {
	a := make([]byte, blocks*blockSize)
	for n := 0; n < b.N; n++ {
		for i := 0; i < blocks; i++ {
			copy(a[i*blockSize:], block)
		}
	}
}

測試結(jié)果

可以看到copy的性能是最好的,當然append的性能也接近copy,for性能較差。

BenchmarkFori-8            19831             52749 ns/op
BenchmarkAppend-8         775945              1478 ns/op
BenchmarkCopy-8           815556              1473 ns/op

原理分析

我們簡單分析copy和append的原理。

copy

代碼

可以看到最終都會調(diào)用memmove()整塊拷貝內(nèi)存,而且是用匯編實現(xiàn)的,因此性能是最好的。

// slicecopy is used to copy from a string or slice of pointerless elements into a slice.
func slicecopy(toPtr unsafe.Pointer, toLen int, fromPtr unsafe.Pointer, fromLen int, width uintptr) int {
	if fromLen == 0 || toLen == 0 {
		return 0
	}

	n := fromLen
	if toLen < n {
		n = toLen
	}

	if width == 0 {
		return n
	}

	size := uintptr(n) * width
	if raceenabled {
		callerpc := getcallerpc()
		pc := funcPC(slicecopy)
		racereadrangepc(fromPtr, size, callerpc, pc)
		racewriterangepc(toPtr, size, callerpc, pc)
	}
	if msanenabled {
		msanread(fromPtr, size)
		msanwrite(toPtr, size)
	}

	if size == 1 { // common case worth about 2x to do here
		// TODO: is this still worth it with new memmove impl?
		*(*byte)(toPtr) = *(*byte)(fromPtr) // known to be a byte pointer
	} else {
		memmove(toPtr, fromPtr, size)
	}
	return n
}

append

代碼

append最終會被編譯期轉(zhuǎn)換成以下代碼,也是調(diào)用了memmove()整塊拷貝內(nèi)存,因此其實性能是和copy差不多的。

	  s := l1
	  n := len(s) + len(l2)
	  // Compare as uint so growslice can panic on overflow.
	  if uint(n) > uint(cap(s)) {
	    s = growslice(s, n)
	  }
	  s = s[:n]
	  memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))

總結(jié)

拷貝方式性能適合場景
for較差無法使用append和copy的場景,比如類型不同,需要更加復雜的判斷等
copy適合提前已經(jīng)分配數(shù)組容量,且不是尾部追加的方式
append適合大多數(shù)情況,尾部追加

大部分情況下還是建議使用append,不僅性能好,動態(tài)擴展容量,而且代碼看起來更加清晰!

到此這篇關(guān)于三種Golang數(shù)組拷貝方式及性能分析詳解的文章就介紹到這了,更多相關(guān)Golang數(shù)組拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang圖片處理庫image基本操作

    golang圖片處理庫image基本操作

    這篇文章主要介紹了golang圖片處理庫image簡介,主要包括圖片的基本讀取與保存及圖片的修改,本文通過通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • 使用Go語言實現(xiàn)敏感詞過濾功能

    使用Go語言實現(xiàn)敏感詞過濾功能

    敏感詞過濾,算是一個比較常見的功能,尤其是在內(nèi)容、社交類應用中更是如此,本文介紹如何使用Go語言實現(xiàn)簡單的敏感詞過濾功能,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 使用golang實現(xiàn)在屏幕上打印進度條的操作

    使用golang實現(xiàn)在屏幕上打印進度條的操作

    這篇文章主要介紹了使用golang實現(xiàn)在屏幕上打印進度條的操作,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • golang切片拷貝的實現(xiàn)

    golang切片拷貝的實現(xiàn)

    在Golang中,切片的淺拷貝只復制指向?qū)ο蟮闹羔?而深拷貝則復制數(shù)據(jù)本身,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • Go語言中new()和 make()的區(qū)別詳解

    Go語言中new()和 make()的區(qū)別詳解

    這篇文章主要介紹了Go語言中new()和 make()的區(qū)別詳解,本文講解了new 的主要特性、make 的主要特性,并對它們的區(qū)別做了總結(jié),需要的朋友可以參考下
    2014-10-10
  • Go中g(shù)in框架的*gin.Context參數(shù)常見實用方法

    Go中g(shù)in框架的*gin.Context參數(shù)常見實用方法

    *gin.Context是處理HTTP請求的核心,ctx代表"context"(上下文),它包含了處理請求所需的所有信息和方法,例如請求數(shù)據(jù)、響應構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見實用方法,需要的朋友可以參考下
    2024-07-07
  • go?module化?import?調(diào)用本地模塊?tidy的方法

    go?module化?import?調(diào)用本地模塊?tidy的方法

    這篇文章主要介紹了go?module化?import?調(diào)用本地模塊?tidy的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 圖文詳解Go程序如何編譯并運行起來的

    圖文詳解Go程序如何編譯并運行起來的

    Go語言這兩年在語言排行榜上的上升勢頭非常猛,Go語言雖然是靜態(tài)編譯型語言,但是它卻擁有腳本化的語法,下面這篇文章主要給大家介紹了關(guān)于Go程序如何編譯并運行起來的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • golang 中signal包的Notify用法說明

    golang 中signal包的Notify用法說明

    這篇文章主要介紹了golang 中signal包的Notify用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Go Time庫中時間和日期相關(guān)的操作方法整理

    Go Time庫中時間和日期相關(guān)的操作方法整理

    這篇文章主要為大家整理了Go語言中的time庫,包括時間、日期和時區(qū)等相關(guān)概念及使用方法,希望通過掌握這些知識,大家可以更好地處理時間、日期和時區(qū)相關(guān)的問題
    2023-08-08

最新評論

柳林县| 灵川县| 石渠县| 当涂县| 延川县| 夏津县| 漯河市| 桐柏县| 东山县| 龙里县| 利川市| 义马市| 延吉市| 兴和县| 深水埗区| 英超| 元阳县| 荃湾区| 炎陵县| 抚松县| 云龙县| 随州市| 红安县| 集安市| 罗江县| 平湖市| 涞源县| 绥阳县| 绥化市| 巩留县| 宜阳县| 玛曲县| 永丰县| 治多县| 庄河市| 开平市| 西吉县| 祁门县| 四川省| 泸西县| 时尚|