J'essaie de mesurer certaines performances mais j'ai trouvé un résultat très contre-intuitif auquel je résiste. A savoir, que l'interrogation d'un Dictionary<DateTime>
est plus rapide en mode DEBUG que dans le mode RELEASE.Dictionnaire DateTime plus rapide en mode DEBUG?
De toute évidence, le bug doit être dans ma routine de mesure - mais où? Le voici:
Dictionary<DateTime, int> d1 = new Dictionary<DateTime, int>();
// fill the dictionary
DateTime now = DateTime.Now;
const int items = 100000;
for (int i = 0; i < items; i++)
{
DateTime item = now.AddSeconds(-i);
d1.Add(item, i);
}
Console.WriteLine("Items ready");
const int calls = 100000000;
DateTime queryDate = DateTime.Now;
// query the dictionary
var stopwatch = Stopwatch.StartNew();
for (int i = 0; i < calls; i++)
{
int j;
if (d1.TryGetValue(queryDate, out j))
{
throw new InvalidOperationException();
}
}
stopwatch.Stop();
Console.WriteLine("{0}ms", stopwatch.ElapsedMilliseconds);
Je lance cette application de console en appuyant sur Ctl-F5, donc VS n'est pas attaché. Sur mon ordinateur portable, j'ai environ 1200ms pour la version compilée DEBUG, et environ 2200ms (!) En mode RELEASE.
Ce que j'ai vérifié/essayé:
- Les paramètres du projet ne sont que la valeur par défaut de VS 2015: « optimiser le code » est cochée pour RELEASE mais pas pour DEBUG. Pour reproduire, créez simplement un nouveau projet d'application Console et copiez-collez le code dans
Program
. - Lorsque je mesure la même chose avec
int
étant le type de clé du dictionnaire, le mode RELEASE est légèrement plus rapide que DEBUG comme prévu.
S'il vous plaît aider à découvrir mon point aveugle!
Combien de fois avez-vous mesuré cela? – SeM
Dix, vingt fois. Je ne pouvais pas et ne peux pas le croire. – Dejan
@HansPassant: * duh *, j'ai utilisé x86. Je le savais, c'est quelque chose de stupide. Je ne m'attendais pas à ce que "Prefer 32-bit" soit la valeur par défaut pour les nouveaux projets. Leçon apprise. Voulez-vous poster votre commentaire en réponse afin que je puisse l'accepter? – Dejan