I have three arrays that need to be combined in one three-dimension array. The following code shows slow performance in Performance Explorer. Is there a faster solution?
for (int i = 0; i < sortedIndex.Length; i++) {
if (i < num_in_left)
{
// add instance to the left child
leftnode[i, 0] = sortedIndex[i];
leftnode[i, 1] = sortedInstances[i];
leftnode[i, 2] = sortedLabels[i];
}
else
{
// add instance to the right child
rightnode[i-num_in_left, 0] = sortedIndex[i];
rightnode[i-num_in_left, 1] = sortedInstances[i];
rightnode[i-num_in_left, 2] = sortedLabels[i];
}
}
Update:
I’m actually trying to do the following:
//given three 1d arrays
double[] sortedIndex, sortedInstances, sortedLabels;
// copy them over to a 3d array (forget about the rightnode for now)
double[] leftnode = new double[sortedIndex.Length, 3];
// some magic happens here so that
leftnode = {sortedIndex, sortedInstances, sortedLabels};
Use Buffer.BlockCopy. Its entire purpose is to perform fast (see Buffer):
Admittedly, I haven’t done any benchmarks, but that’s the documentation. It also works on multidimensional arrays; just make sure that you’re always specifying how many bytes to copy, not how many elements, and also that you’re working on a primitive array.
Also, I have not tested this, but you might be able to squeeze a bit more performance out of the system if you bind a delegate to
System.Buffer.memcpyimpland call that directly. The signature is:It does require pointers, but I believe it’s optimized for the highest speed possible, and so I don’t think there’s any way to get faster than that, even if you had assembly at hand.
Update:
Due to requests (and to satisfy my curiosity), I tested this:
The results:
Now change the order:
Now change the order again:
or, in other words: they’re very competitive; as a general rule,
memcpyimplis fastest, but it’s not necessarily worth worrying about.