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
Barbara Streisandoriginal
2024-12-28 06:03:10812parcourir

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));

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));
    }
}

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!

Déclaration:
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