Der bereitgestellte Codeausschnitt zeigt eine langsame Leistung beim Kopieren von drei Arrays in ein einziges dreidimensionales Array. Hier sind einige alternative Lösungen, um eine schnellere Ausführung zu erreichen:
Buffer.BlockCopy wurde speziell für die schnelle Manipulation primitiver Typen innerhalb von Arrays entwickelt. Es bietet erhebliche Leistungsverbesserungen gegenüber ähnlichen Methoden in System.Array. Um Buffer.BlockCopy zu verwenden, befolgen Sie diese Schritte:
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));
Für eine optimale Leistung können Sie System.Buffer.memcpyimpl, die zugrunde liegende Funktion, direkt aufrufen Wird von Buffer.BlockCopy verwendet. Diese Methode erfordert Zeiger, ist aber für maximale Geschwindigkeit optimiert. Beachten Sie jedoch, dass es nur auf primitiven Arrays funktioniert.
//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)); } }
Empirisch weisen Buffer.BlockCopy und System.Buffer.memcpyimpl eine konkurrenzfähige Leistung auf. Die Wahl zwischen ihnen ist oft vernachlässigbar.
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Arrays in C# effizient kombinieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!