ホームページ > バックエンド開発 > C++ > C# で複数の配列を効率的に組み合わせるにはどうすればよいですか?

C# で複数の配列を効率的に組み合わせるにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-28 06:03:10
オリジナル
793 人が閲覧しました

How Can I Efficiently Combine Multiple Arrays in C#?

C で配列を効率的に結合するための代替ソリューション

提供されたコード スニペットは、3 つの配列を 1 つの 3 次元配列にコピーするときにパフォーマンスが低下します。より高速な実行を実現するための代替ソリューションをいくつか紹介します。

Buffer.BlockCopy の利用

Buffer.BlockCopy は、配列内のプリミティブ型の高速操作用に特別に設計されています。 System.Array の同様のメソッドに比べてパフォーマンスが大幅に向上します。 Buffer.BlockCopy を使用するには、次の手順に従います。

double[] sortedIndex, sortedInstances, sortedLabels;
double[,] leftnode = new double[sortedIndex.Length, 3];

// Copy sortedIndex into the first column of leftnode
Buffer.BlockCopy(sortedIndex, 0, leftnode, 0, sortedIndex.Length * sizeof(double));

// Copy sortedInstances into the second column of leftnode
Buffer.BlockCopy(sortedInstances, 0, leftnode, sortedIndex.Length * sizeof(double), sortedInstances.Length * sizeof(double));

// Copy sortedLabels into the third column of leftnode
Buffer.BlockCopy(sortedLabels, 0, leftnode, sortedIndex.Length * sizeof(double) + sortedInstances.Length * sizeof(double), sortedLabels.Length * sizeof(double));
ログイン後にコピー

System.Buffer.memcpyimpl の活用

最適なパフォーマンスを得るには、基になる関数である System.Buffer.memcpyimpl を直接呼び出すことができます。 Buffer.BlockCopy によって使用されます。このメソッドにはポインターが必要ですが、最大速度が得られるように最適化されています。ただし、プリミティブ配列でのみ動作することに注意してください。

//assuming arrays of primitives and pointers are available
double[] sortedIndex, sortedInstances, sortedLabels;
double[,] leftnode = new double[sortedIndex.Length, 3];

unsafe
{
    fixed (double* pSortedIndex = &sortedIndex[0])
    fixed (double* pSortedInstances = &sortedInstances[0])
    fixed (double* pSortedLabels = &sortedLabels[0])
    fixed (double* pLeftnode = &leftnode[0, 0])
    {
        Buffer.memcpyimpl((byte*)pSortedIndex, (byte*)pLeftnode, sortedIndex.Length * sizeof(double));
        Buffer.memcpyimpl((byte*)pSortedInstances, (byte*)pLeftnode + sortedIndex.Length * sizeof(double), sortedInstances.Length * sizeof(double));
        Buffer.memcpyimpl((byte*)pSortedLabels, (byte*)pLeftnode + sortedIndex.Length * sizeof(double) + sortedInstances.Length * sizeof(double), sortedLabels.Length * sizeof(double));
    }
}
ログイン後にコピー

パフォーマンス ベンチマーク

経験的に、Buffer.BlockCopy と System.Buffer.memcpyimpl は競合するパフォーマンスを示します。多くの場合、どちらかを選択するのは無視できるほどです。

以上がC# で複数の配列を効率的に組み合わせるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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