Question

J'ai la cervelle creuse la essayant de comprendre ce que le diable se passe avec la plus récente (non bêta) Visual Studio 2008 SP1:

Mon application construite avec OpenMP fonctionne incroyablement lent dans le débogueur, ce qui porte l'utilisation du processeur à 100%. Quand ils sont exécutés en dehors du débogueur, il fonctionne simplement lentement (pour une version release).

Mon application construite avec le fil Intel bibliothèque des blocs de construction, ou ma propre mise en œuvre de l'équipe de fil, est plus lent dans le débogueur que lorsqu'il est exécuté en dehors du débogueur (pour une version release).

Quand je vais à mon autre machine de développement, qui n'a pas eu le Service Pack 1 installé, la situation est différente. Courir dans le débogueur, ou à l'extérieur, n'a pas d'effet sur la performance du programme. OpenMP accélère mon application, comme ne se visse ou blocs de construction de mon propre code d'équipe de fil (écrit à la hâte sur l'exaspération de comprendre ce problème).

Ceci est avec absolument aucun changement à l'application, il suffit d'exécuter à l'intérieur ou à l'extérieur, du débogueur, SP1 par rapport à Visual Studio régulière.

Je n'ai rien trouvé à ce sujet sur Google, donc je suis coller mon cou et dire quelque chose dans l'espoir que quelqu'un d'autre pourrait reconnaître ce qui leur arrive. Soit ça, ou je vois les choses.

Était-ce utile?

La solution

Oui. Dans certains cas. Nous avons vécu une situation similaire extrêmement ralentissement après le passage à SP1. La cause de cette exception était. Nous avons eu un datamodel qui a fait beaucoup d'utilisation d'un modèle d'essayer d'accéder aux clés dans un dictionnaire, ayant échouer, et attraper l'exception:

try {
  var a = dict[key];
} catch(KeyNotFoundException) {
  dict[key] = default;
  a = default;
}

Ceci est juste un exemple, mais la cause était une exception du tout. Pour une raison quelconque, VS, dans le débogueur, est extrêmement lent. Notez que ce fut le cas avant, mais il était nettement moins bonne avec le nouveau patch.

La solution est d'utiliser simplement toujours un test. pour l'exemple le dictionnaire ci-dessus, utilisez le .TryGet ou dans le contrôle de code personnalisé si votre appel va générer une exception avant d'appeler, si elle est quelque chose qui va se passer beaucoup (est donc une chose « attendu » au lieu d'une chose « exceptionnel ») .

Plus d'info: Exceptions et performance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top