Alex Rivera | Logout

Extremely fast way to clone the values of a jagged array into a second array?

Asked 2011-01-12T15:44:29.287
12

I am currently working on an application that is responsible for calculating random permutations of a jagged array.

Currently the bulk of the time in the application is spent copying the array in each iteration (1 million iterations total). On my current system, the entire process takes 50 seconds to complete, 39 of those seconds spent cloning the array.

My array cloning routine is the following:

    public static int[][] CopyArray(this int[][] source)
    {
        int[][] destination = new int[source.Length][];
        // For each Row
        for (int y = 0; y < source.Length; y++)
        {
            // Initialize Array
            destination[y] = new int[source[y].Length];
            // For each Column
            for (int x = 0; x < destination[y].Length; x++)
            {
                destination[y][x] = source[y][x];
            }
        }
        return destination;
    }

Is there any way, safe or unsafe, to achieve the same effect as above, much faster?

Edit
Report

1 Answer

1

You can use Array.Clone for the inner loop:

public static int[][] CopyArray(this int[][] source)
{
    int[][] destination = new int[source.Length][];
    // For each Row
    for(int y = 0;y < source.Length;y++)
    {
        destination[y] = (int[])source[y].Clone();
    }
    return destination;
}

Another alternative for the inner loop is Buffer.BlockCopy, but I haven't measured it's performance against Array.Clone - maybe it's faster:

destination[y] = new int[source[y].Length];
Buffer.BlockCopy(source[y], 0, destination[y], 0, source[y].Length * 4);

Edit: Buffer.BlockCopy takes the number for bytes to copy for the count parameter, not the number of array elements.

answered 2011-01-12T16:05:37.343

Your Answer