2017-10-04 4 views
0

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!

+0

Combien de fois avez-vous mesuré cela? – SeM

+0

Dix, vingt fois. Je ne pouvais pas et ne peux pas le croire. – Dejan

+0

@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

Répondre

1

Les paramètres par défaut pour les nouveaux projets dans VS2015 sont "Préférer 32 bits". Et pour ce code particulier, il semble que la gigue x86 se comporte de manière sous-optimale.

Selon Hans Passant:

Il n'y a pas grand-chose que l'optimiseur peut faire pour améliorer ce code. Le cadre de pile de l'appel TryGetValue() peut être configuré de deux manières différentes. Le générateur de code utilisé d'une manière, la façon «moderne» en écrivant les arguments directement à la pile. Mais l'optimiseur a utilisé un autre moyen, le "olden" en utilisant PUSH. Le moyen le moins efficace. Ceci est spécifique à la gigue x86, la gigue x64 n'a pas ce problème.

En effet, en passant à 64 bits, le mode RELEASE devient légèrement plus rapide que prévu.