2017-10-16 8 views
1

J'essaie de vérifier si une instruction while avec un bloc vide est optimisée par JIT, donc j'essaie d'exécuter mon code en mode release et d'afficher le code de la fenêtre Debug-> Windows-> Disassembly de Visual Studio. Cependant, je ne vois aucun changement par rapport au code compilé. J'ai essayé d'ajouter quelques déclarations que je compte être optimisé:Comment puis-je simuler du code optimisé JIT et voir le changement?

bool b = false; 
    if (b) 
         { 
          new Object(); 
         } 

mais je vois encore sur la fenêtre de démontage:

     bool b = false; 
         if (b) 
         { 
0524A8FF mov   ecx,dword ptr [ebx+0Ch] 
0524A902 push  dword ptr ds:[33422A0h] 
0524A908 mov   edx,esi 
0524A90A cmp   dword ptr [ecx],ecx 
0524A90C call  71DE3490 
0524A911 test  eax,eax 
0524A913 je   0524A97C 
0524A915 mov   ecx,51DEAC4h 
0524A91A call  002E30F4 
0524A91F mov   edi,eax 
0524A921 lea   edx,[edi+8] 
0524A924 call  72D12410 
          new Object(); 
         } 

J'ai aussi essayé avec l'outil NGen qui est mentionné sur un related question, mais je continue à voir mon "code indésirable" (que je m'attendais à être optimisé), peut-être le problème est que je n'écris pas un "code indésirable" qui sera optimisé, si c'est le cas je serais heureux pour un meilleur exemple de code que le JIT devrait optimiser.

Comment puis-je ajouter un code trivial qui sera optimisé à coup sûr, puis vérifier dans cette fenêtre de désassemblage que le code que j'ai ajouté n'est pas là?

+0

Assurez-vous de lire toutes les réponses dans la question en double, pas seulement celle acceptée – Evk

+0

@Evk - voulez-vous dire de désélectionner "Supprimer l'optimisation JIT sur la charge du module" & "Activer juste mon code"? Je l'ai déjà fait. – BornToCode

+0

Donc, aucune réponse à la question en double ne vous aide à résoudre le problème? – Evk

Répondre

2

L'extrait n'est pas assez bon pour obtenir un repro. L'étoffant:

class Program { 
    static void Main(string[] args) { 
     bool b = false; 
     if (b) { 
      new object(); 
     } 
    } 
} 

Produit:

  bool b = false; 
02390450 ret 

C'est l'optimisation extrême au travail, aucun du code survécu. L'optimiseur de gigue peut dire que b est toujours faux, donc cela ne dérange pas de générer l'appel du constructeur. L'élimination du code mort est l'un des optimization strategies.

J'ai essayé d'ajouter quelques déclarations que je compte optimiser

C'était le problème, vous ne pouvez pas voir tout effet secondaire des déclarations supplémentaires qui ne produisent pas de code. Tout ce qu'il y a, c'est le code machine produit par le code original. Prenez garde que les annotations source visibles dans la fenêtre de désassemblage ne soient précises que lorsque vous utilisez la version de débogage. Dans la version Release optimisée, ils peuvent être assez déroutants en raison du déplacement et de la suppression du code par l'optimiseur.

+0

Lorsque j'ai copié votre code dans une nouvelle petite application Console, j'ai vu que vous aviez raison et que c'était optimisé.Quand j'ai essayé d'intégrer le 'bool b = false; si (b) { nouvel objet(); } 'partie à ma grande application réelle (et l'a couru avec la config version, optimisation activée) le code mort n'a pas été éliminé. Je ne comprends pas pourquoi? – BornToCode

+1

Il vous manque toujours le point, aucun code machine dans votre question n'a été généré par le code ajouté. Il n'y a pas de code ajouté. Nous ne pouvons pas voir l'instruction qui apparaît avant, mais je devinerais à une expression qui utilise l'opérateur conditionnel. Le type d'expression très dense qui donne à la gigue un mal de tête lancinant quand elle a besoin de générer des informations de débogage à partir du code optimisé. C'est pourquoi l'annotation source apparaît au mauvais endroit. Gardez toujours à l'esprit que les informations de débogage sont très imparfaites pour le code généré Release, c'est la raison même pour laquelle une configuration Debug existe. –