Saturday, June 13, 2009

Är Activator.CreateInstance långsam? - Ett litet experiment

Igår, när jag funderade lite på PageTypeBuilderprojektet behövde jag ett svar på frågan i rubriken, dvs är Activator.CreateInstance långsam. Jag googlade runt och hittade en hel del intressanta artiklar, bland annat denna som är lite off topic men intressant. Till slut bestämde jag mig ändå för att göra ett eget litet experiment.

Jag skapade en ny klass med tio sträng-properties (jag experimenterade med andra varianter också men klassens utformning verkade inte spela någon roll) vilken jag instansierade mellan 1 000 och 10 000 000 gånger, dels genom att använda dess konstruktor och dels genom att använda Activator.CreateInstance. Resultatet visas i tabellen nedan.

Antal instanser Konstruktor (s) Per instans (ms) CreateInstance (s) Per instans (ms)
1000 0 0,00000 0,0156 0,01560
10000 0 0,00000 0,0313 0,00313
100000 0 0,00000 0,3594 0,00359
1000000 0,0625 0,00006 3,5468 0,00355
10000000 0,5156 0,00005 35,4219 0,00354

Den totala tidsåtgången i sekunder visas i nedan diagram.



Tidsåtgången per instans visas i nedan diagram.



Nu var ju detta test långt ifrån vetenskapligt men om man ändå försöker sig på att dra en slutsats så kan vi börja med att konstatera att tidsåtgången för att skapa en instans med Activator.CreateInstance visserligen är avsevärt högre än att använda konstruktorn (vilket man ju i vissa lägen inte kan, exempelvis då vi vet vilken typ vi vill instansiera först vid runtime) men att den samtidigt är försumbar då vi bara vill skapa ett mindre antal objekt.