ホームページ  >  記事  >  バックエンド開発  >  Golangで渡す関数パラメータの効率解析

Golangで渡す関数パラメータの効率解析

王林
王林オリジナル
2024-04-12 13:03:021064ブラウズ

Golang 関数のパラメータの受け渡しには、値の受け渡しと参照の受け渡しの 2 つの方法があります。値渡しではパラメータのコピーが作成されますが、これは安全ですが高価です。参照渡しではパラメータ ポインタが渡されますが、これは安価ですが、元の値を変更するリスクと同時実行の問題が伴います。

Golangで渡す関数パラメータの効率解析

Golang での関数パラメーター受け渡しの効率分析

関数パラメーター受け渡しは、特に大規模データの場合、プログラムのパフォーマンスにおいて重要な役割を果たします。構造物や複雑なオブジェクト。 Golang は、関数パラメータを渡す 2 つの方法、値の受け渡しと参照の受け渡しを提供します。

値の受け渡し

値の受け渡しでは、パラメーター値のコピーを作成し、それを関数に渡します。関数内のパラメーターを変更しても呼び出し元の元の値に影響を与えないため、これは安全な受け渡し方法です。ただし、渡されたパラメータが大規模なデータ構造または複雑なオブジェクトである場合、追加のメモリ オーバーヘッドとコピー時間が発生します。

func foo(x int) {
    x++ // 修改 x 的副本,不会影响调用者原始值
}

参照渡し

参照渡しでは、値そのものではなく、パラメーターのポインターが渡されます。これにより、特に大規模なデータ構造や複雑なオブジェクトを渡す場合に、メモリのオーバーヘッドとコピー時間を大幅に削減できます。ただし、参照渡しには次のような欠点があります。

  1. パラメータの変更: 関数内のパラメータ ポインタを変更すると、呼び出し元の元の値に影響します。
  2. 同時実行性の問題: パラメーターが共有リソースの場合、参照渡しによって同時実行性の問題が発生する可能性があります。
func foo(x *int) {
    *x++ // 修改原始值,因为传递的是指针
}

実践的なケース

値の受け渡しと参照の受け渡しのパフォーマンスを比較する実践的なケースを次に示します。

package main

import (
    "fmt"
    "time"
)

type LargeStruct struct {
    Data []byte
}

func main() {

    // 创建一个大型结构
    largeStruct := &LargeStruct{Data: make([]byte, 1000000)}

    // 使用值传递
    start := time.Now()
    for i := 0; i < 100000; i++ {
        foo(largeStruct)
    }
    elapsed1 := time.Since(start)

    // 使用引用传递
    start = time.Now()
    for i := 0; i < 100000; i++ {
        fooPtr(largeStruct)
    }
    elapsed2 := time.Since(start)

    fmt.Println("值传递耗时:", elapsed1)
    fmt.Println("引用传递耗时:", elapsed2)
}

func foo(largeStruct LargeStruct) {}

func fooPtr(largeStruct *LargeStruct) {}

この場合, 値渡しは、foo 関数が呼び出されるたびに大きな構造全体がコピーされるため、参照渡しよりもはるかに遅くなります。

以上がGolangで渡す関数パラメータの効率解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。