Maison >développement back-end >C++ >Comment puis-je combiner efficacement plusieurs 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 :
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));
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)); } }
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!