ホームページ > バックエンド開発 > Golang > C の memset に相当する高速で効率的な Go はありますか?

C の memset に相当する高速で効率的な Go はありますか?

DDD
リリース: 2024-12-22 04:22:10
オリジナル
121 人が閲覧しました

Is there a fast and efficient Go equivalent to C  's memset?

C の memset 関数に相当する Go 関数はありますか?

C では、 memset を使用して特定の値で配列を初期化できます。 。この機能は特に効率的です。 Go では、配列またはスライスをすべてゼロで初期化するのは、make([]int, 1000000); を使用することで簡単です。ただし、ゼロ以外の値で初期化するオプションは提供されません。

ループを手動初期化に使用できますが、memset の効率が欠けています。

memset アナログGo の場合:

1.ループベースのアプローチ:

func memsetLoop(a []int, v int) {
    for i := range a {
        a[i] = v
    }
}
ログイン後にコピー

2. copy() ベースのアプローチ (推奨):

copy() 関数は高度に最適化されており、memset のような操作に利用できます。

func memsetRepeat(a []int, v int) {
    if len(a) == 0 {
        return
    }
    a[0] = v
    for bp := 1; bp < len(a); bp *= 2 {
        copy(a[bp:], a[:bp])
    }
}
ログイン後にコピー

このソリューションは、最初の要素を手動で削除し、copy() を使用して設定済みの部分を未設定の部分にコピーします。このアルゴリズムは 2 倍手法を使用して、log(n) の反復回数を減らします。

ベンチマーク:

memsetRepeat() と memsetLoop() のベンチマークでは、顕著なパフォーマンスが示されています。要素数、特に 3800 ~ 4000 あたりが増加すると、memsetRepeat() が有利になります。 elements.

追加の注意:

小さなスライスの場合、memsetLoop() のパフォーマンスがわずかに向上する可能性があります。ただし、me​​msetRepeat() は、スライスが大きくなるとパフォーマンスが大幅に向上します。

以上がC の memset に相当する高速で効率的な Go はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート