ホームページ >よくある問題 >Go 言語に関する 2 つの効率的なヒント

Go 言語に関する 2 つの効率的なヒント

little bottle
little bottle転載
2019-04-30 09:43:483476ブラウズ

この記事では、Go 言語の効率的なヒントを 2 つ紹介します: 1 つは文字列の操作に fmt.Sprintf を使用しないこと、もう 1 つは固定フィールドのキーと値のペアの代わりに一時的な構造体を使用することです。 {}。

1. 文字列の操作には fmt.Sprintf を使用しないでください

文字列の操作は非常に便利ですが、非常に遅く、Go 言語で使用するとプログラムの実行速度が速くなります。スクリプトです。言語はまだいっぱいです。信じられない場合は、自分でテストできます。操作を使用して 100,000 回反復してください。Python と Javascript は Go よりもはるかに高速です (少なからずかなり)

func TestStr(t *testing.T) {
    str := ""
    for i := 0; i < 100000; i++ {
        str += "test"
    }
}

テスト結果

PASS: TestStr (3.32s)
str=""
for i in range(100000):
    str+="test"

テスト結果:

~/» time python test.py
0.03s user 0.03 秒 システム 81% CPU 0.078 合計

静的言語として、このような単純なコードに対する Go の実行効率は Python の 100 倍遅いです。信じられないほどではありませんか? Go では問題ありませんが、Go で文字列処理を使用するとパフォーマンスに非常に負荷がかかるため、Python では文字列を操作するための最適化をオーバーロードする必要があります。 (Javascript は文字列も非常に高速に処理します)

関連チュートリアル: go ビデオ チュートリアル

最も効果的な方法は、buffer
strBuf := bytes.NewBufferString("")
for i := 0; i < 100000; i++ {
    strBuf.WriteString("test")
}
を使用することです。

結果を自分でテストできます。驚くでしょう。

単純に 2 つの文字列を結合する必要がある場合もあります。Buffer を使用するのは少し面倒ですが、fmt.Sprintf( を使用することを考えるのが簡単です) ) を組み合わせるために、多くのパッケージのソース コードもこの方法で書かれています。実際、fmt の Sprintf も非常に遅いので、複雑な型変換出力がない場合は、strings.Join を使用した方がパフォーマンスがはるかに高くなります

func TestStr(t *testing.T) {
    a, b := "Hello", "world"
    for i := 0; i < 1000000; i++ {
        fmt.Sprintf("%s%s", a, b)
        //strings.Join([]string{a, b}, "")
    }
}
PASS: TestStr (0.29s)
func TestStr(t *testing.T) {
    a, b := "Hello", "world"
    for i := 0; i < 1000000; i++ {
        //fmt.Sprintf("%s%s", a, b)
        strings.Join([]string{a, b}, "")
    }
}
PASS: TestStr (0.09s)

結果から判断すると、strings.Join は Sprint を使用するよりも約 4 倍高速です。

2. 固定フィールドのキーと値のペアの場合は、map[string]interface の代わりに一時的な Struct を使用します。{}

簡単な例を示します

func TestData(t *testing.T) {

    for i := 0; i < 100000000; i++ {
        var a struct {
            Name string
            Age  int
        }
        a.Name = "Hello"
        a.Age = 10
    }
}
PASS: TestData ( 0.04s)
func TestData2(t *testing.T) {

    for i := 0; i < 100000000; i++ {
        var a = map[string]interface{}{}
        a["Name"] = "Hello"
        a["Age"] = 10
    }
}
PASS: TestData2 (38.30s)

効率は数千倍違います。
フィールドが既知の場合、一時的な構造体を使用すると、実行時にコンテンツを動的に割り当てる必要がなく、マップなどのインデックスを確認する必要もないため、速度が大幅に速くなります。

以上がGo 言語に関する 2 つの効率的なヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。