Powiedz, że mam kod, który musi zostać zoptymalizowany, ale łatwy do debugowania w tym samym czasie. W ten sposób przypisze ciąg znaków do każdej wartości, której używam. Czy ciąg zadaje duże trafienie wydajnościowe lub jest przekształcany w stałą referencję uzyskaną z ciągu znaków.Intern podczas kompilacji JIT
/AOT
, zamieniając się w pojedynczą prostą instrukcję?Czy CIL ldstr jest zastępowane stałym odwołaniem do ciągu znaków.Intern podczas kompilacji JIT/AOT?
przykład:
W IL byłoby ldstr "gazilion lines"
.
Czy podczas JIT/AOT kompilacji zamienił się coś podobnego ldsflda string.InternCache.ID_0000647516166
i const string ID_0000647516166 = "gazilion lines";
jest dodawany do string.InternCache
?
Tak, teoretycznie mógłbym zaglądnąć w https://github.com/mono/mono, ale nie mam pojęcia, jak go znaleźć.
Tak, miksuję CIL, C# i niezależnie od tego, w jaki CIL jest kompilowany, ale masz pomysł.
Czy ldstr
jest gwarantowane jako O(1)
?
Tak, to "szczegóły implementacji" CLR, ale miałoby sens, gdyby został zoptymalizowany w ten sposób.
Długa odpowiedź: tak. Staje się jednym MOV reg, imm instrukcji w czasie wykonywania, należy użyć debugger, który może pokazać demontażu, więc nie musisz się martwić o to, jak działa token metadanych i jitter. –