Maison > développement back-end > C++ > Comment puis-je combiner efficacement plusieurs tableaux en C# ?

Comment puis-je combiner efficacement plusieurs tableaux en C# ?

Barbara Streisand
Libérer: 2024-12-28 06:03:10
original
851 Les gens l'ont consulté

How Can I Efficiently Combine Multiple Arrays in C#?

Solutions alternatives pour combiner efficacement des tableaux en C

L'extrait de code fourni présente des performances lentes lors de la copie de trois tableaux en un seul tableau tridimensionnel. Voici quelques solutions alternatives pour obtenir une exécution plus rapide :

Utilisation de Buffer.BlockCopy

Buffer.BlockCopy est spécialement conçu pour la manipulation à grande vitesse de types primitifs dans les tableaux. Il offre des améliorations significatives des performances par rapport aux méthodes similaires dans System.Array. Pour utiliser Buffer.BlockCopy, suivez ces étapes :

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));
Copier après la connexion

Exploitation de System.Buffer.memcpyimpl

Pour des performances optimales, vous pouvez appeler directement System.Buffer.memcpyimpl, qui est la fonction sous-jacente utilisé par Buffer.BlockCopy. Cette méthode nécessite des pointeurs mais est optimisée pour une vitesse maximale. Cependant, notez qu'il ne fonctionne que sur des tableaux primitifs.

//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));
    }
}
Copier après la connexion

Analyse comparative des performances

Empiriquement, Buffer.BlockCopy et System.Buffer.memcpyimpl présentent des performances compétitives. Le choix entre eux est souvent négligeable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal