2015-12-20 3 views
5

Dites que j'ai un code qui doit être optimisé mais facile à déboguer en même temps. J'attribuerais donc une chaîne à chaque valeur que j'utilise. La chaîne inflige-t-elle un impact majeur sur les performances ou est-elle transformée en une référence constante obtenue à partir de la chaîne.Intern pendant la compilation JIT/AOT, se transformant ainsi en une seule instruction simple?Est-ce que CIL ldstr est remplacé par une référence constante à la chaîne? À l'intérieur de la compilation JIT/AOT?

Exemple:

En IL serait ldstr "gazilion lines".

est-il au cours JIT/compilation AOT transformé en quelque chose comme ldsflda string.InternCache.ID_0000647516166 et const string ID_0000647516166 = "gazilion lines"; est ajouté à string.InternCache?

Oui, je pourrais théoriquement regarder dans https://github.com/mono/mono mais je n'ai aucune idée comment le trouver.

Oui, je suis en train de mixer CIL, C# et tout ce qui est compilé dans CIL, mais vous avez l'idée.

Est-ce que ldstr est garanti être O(1)?

Oui c'est le "détail d'implémentation" du CLR mais cela aurait du sens s'il était optimisé de cette façon.

+2

Réponse longue: oui. Devient un seul reg MOV, instruction imm à l'exécution, assurez-vous d'utiliser un débogueur qui peut vous montrer le désassemblage de sorte que vous n'avez pas à vous inquiéter de la façon dont le jeton de métadonnées et la gigue fonctionne. –

Répondre

1

Réponse longue: oui. Assurez-vous d'utiliser un débogueur qui peut vous montrer le désassemblage afin que vous n'ayez pas à vous soucier du fonctionnement du jeton de métadonnées et de la gigue. - Hans Passant

+0

Veuillez développer les questions individuelles. – user2864740