제공된 코드 조각은 3개의 배열을 단일 3차원 배열로 복사하는 데 느린 성능을 나타냅니다. 더 빠른 실행을 달성하기 위한 몇 가지 대체 솔루션은 다음과 같습니다.
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을 직접 호출할 수 있습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!