Brand new smell, or reused arrays

You’d think trying save .NET CLR from constantly allocate memory on the heap for a new array would give save you some ticks here or there. Maybe give the garbage collector a break from finding all these thrown away array instances on the heap.

Lemme give you the surprising anti-climax. It is not statistically significant.

NEW vs REUSE

Iterations  new byte[]   reuse  difference(ms)
1 x 10000       1594ms  1094ms  500
2 x 10000       2656ms  2093ms  563
3 x 10000       3250ms  3344ms  -94
4 x 10000       4125ms  4359ms  -234
5 x 10000       5172ms  5141ms  31
6 x 10000       6391ms  6172ms  219
7 x 10000       7422ms  7203ms  219
8 x 10000       8453ms  8203ms  250
9 x 10000       9453ms  9641ms  -188

If it was, wouldn’t the difference get bigger as there are more iterations? One test gets a new reference to a byte[] each time. The other copies the same reference to a byte[] from a static variable.

Don’t be fooled by the increasing numbers with increasing iterations. That’s the test filling with random data. It’s the difference between the 2 that matters. So it would seem, there is very little to be gained by avoid instantiating new arrays, for the cost of trying to figure out where the hell is “__buffer” declared.

static void Main(string[] args)
{
    Random rnd = new Random(Environment.TickCount);
     
    int START_SIZE = 10000;
    int SAMPLES = 10;
    int[] a = new int[SAMPLES];
    int[] b = new int[SAMPLES];

    Console.WriteLine("New byte[] array each loop");
    for (int j = 1; j < SAMPLES; j++)
    {
        var size = START_SIZE* j;
        var start1 = Environment.TickCount;
        for (int i = 0; i < size; i++)
        {
            byte[] buffer = new byte[START_SIZE];
            rnd.NextBytes(buffer);
        }
        a[j] = Environment.TickCount - start1;
        Console.WriteLine("iterations={0}, {1}ms", size, a[j]);
    }


    Console.WriteLine("reusing byte[] array");
    __buffer = new byte[START_SIZE];
    for (int j = 1; j < SAMPLES; j++)
    {
        var size = START_SIZE * j;
        var start1 = Environment.TickCount;
        for (int i = 0; i < size; i++)
        {
            var buffer = __buffer;
            rnd.NextBytes(buffer);
        }
        b[j] = Environment.TickCount - start1;
        Console.WriteLine("iterations={0}, {1}ms", size, b[j]);
    }

    Console.WriteLine("NEW vs REUSE");
    for (int j = 1; j < SAMPLES; j++)
    {
        Console.WriteLine("{0} x {1} \t{2}ms \t{3}ms \t{4}", j, START_SIZE, a[j], b[j], a[j]- b[j]);
    }
    Console.ReadLine();
}

static byte[] __buffer;

Leave a Reply

Your email address will not be published. Required fields are marked *