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.
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. –