isbits Union Optimizations

Julia'da Array türü hem "bit" değerlerini hem de yığın tahsisli "kutulu" değerleri tutar. Ayrım, değerin kendisinin dizinin doğrudan tahsis edilen belleğinde saklanıp saklanmadığı veya dizinin belleğinin başka yerlerde tahsis edilen nesnelere işaret eden bir işaretçi koleksiyonu olup olmadığıdır. Performans açısından, değerleri doğrudan erişmek, gerçek değere giden bir işaretçiyi takip etmekten açıkça bir avantajdır. "isbits" tanımı genellikle sabit, belirli bir boyuta sahip herhangi bir Julia türünü ifade eder, yani "işaretçi" alanları yoktur, bkz. ?isbitstype.

Julia ayrıca, bir dizi türün birleşimi olan Union türlerini destekler. Özel Union türü tanımlamaları, nominal tür sistemini (yani, açık alt tür ilişkileri) "aşmak" ve bu, aksi takdirde alakasız olan türler kümesi üzerinde yöntemler veya işlevsellik tanımlamak isteyen uygulamalar için son derece kullanışlı olabilir. Ancak, bir derleyici zorluğu, bu Union türlerini nasıl ele alacağını belirlemektir. Naif yaklaşım (ve aslında, Julia'nın 0.7 öncesinde yaptığı şey), basitçe bir "kutu" yapmak ve ardından kutudaki gerçek değere bir işaretçi koymaktır; bu, daha önce bahsedilen "kutulanmış" değerlerle benzerlik gösterir. Ancak bu, birçok küçük, ilkel "bit" türü (örneğin UInt8, Int32, Float64 vb.) bu "kutunun" içine kolayca sığabileceği ve değer erişimi için herhangi bir dolaylı bağlantıya ihtiyaç duymayacağı için talihsizdir. 0.7 itibarıyla Julia'nın bu optimizasyondan yararlanabileceği iki ana yol vardır: türlerde isbits Union alanları ve isbits Union Dizileri.

isbits Union Structs

Julia artık "isbits Union" alanlarının türlerde (mutable struct, struct vb.) satır içi olarak saklandığı bir optimizasyon içeriyor. Bu, Union türünün "satır içi boyutunu" belirleyerek gerçekleştirilir (örneğin, Union{UInt8, Int16} iki bayt boyutuna sahip olacak, bu da en büyük Union türü Int16 için gereken boyutu temsil eder) ve ayrıca, "Union baytları" içinde satır içi saklanan gerçek değerin türünü belirten bir "tip etiket baytı" (UInt8) ayırarak yapılır. Tip etiket baytının değeri, gerçek değerin türünün Union türünün türler sırasındaki indeksidir. Örneğin, Union{Nothing, UInt8, Int16} türüne sahip bir alan için 0x02 değerine sahip bir tip etiketi, yapının belleğindeki alanın 16 bitinde bir Int16 değerinin saklandığını gösterir; 0x01 değeri, alanın belleğindeki 16 bitin ilk 8 bitinde bir UInt8 değerinin saklandığını gösterir. Son olarak, 0x00 değeri, bu alan için nothing değerinin döneceğini belirtir, ancak tekil bir tür olarak tek bir tür örneğine sahip olduğu için teknik olarak boyutu 0'dır. Bir türün Union alanı için tip etiket baytı, alanın hesaplanan Union belleğinin hemen ardından saklanır.

isbits Union Memory

Julia artık "isbits Union" değerlerini bir Bellek içinde doğrudan saklayabiliyor, bu da bir dolaylı kutu gerektirmiyor. Bu optimizasyon, gerçek verilerin byte'larının yanında, her bir eleman için bir byte olan ekstra bir "tip etiket bellek" saklayarak gerçekleştiriliyor. Bu tip etiket bellek, tip alanı durumunun aynı işlevini görüyor: değeri, gerçek saklanan Union değerinin tipini sinyal ediyor. "Tip etiket bellek" normal veri alanının hemen ardından gelir. Bu nedenle, bir isbits Union Dizisi'nin tip etiket byte'larına erişim formülü a->data + a->length * a->elsize şeklindedir.