Engee 文档

组合等位的优化

在Julia中,`Array’类型存储在堆上分配的位值和打包值。 区别在于值本身是否存储为嵌入式(在直接分配的数组内存中),或者数组内存是否只是指向其他地方分配的对象的指针的集合。 就性能而言,访问嵌入值比必须遵循指向实际值的指针具有明显的优势。 Isbits的定义通常意味着任何具有固定确定性大小的Julia类型,这意味着没有指针字段,请参阅'?isbitstype'。

Julia还支持联合类型,字面意思是-一组类型的联合。 自定义联合类型定义对于寻求采用名义类型系统(即显式子类型关系)并为这些不相关的类型集定义方法或功能的应用程序非常有用。 但是,编译器的工作是确定如何处理这些类型的连接。 我们自己的方法(实际上在0.7版本之前在Julia中起作用)是简单地创建一个单元格,然后在单元格中创建一个指向实际值的指针,类似于前面提到的打包值。 然而,这是一个不幸的解决方案,因为有许多小的原始位类型(例如,UInt8Int32,`Float64`等。)这将很容易地适合这个单元格,而不需要重定向访问该值。 在Julia0.7中,优化这种方法主要有两种方法:isbits join fields和isbits join arrays。

Isbits关联结构

Julia现在包含了一个优化,其中isbits在类型(可变结构结构`等)中联合字段。)将被存储为嵌入式。 这是通过定义union类型的嵌入大小来实现的(例如,'Union{UInt8, Int16}`将具有2字节的大小,这是最大联接类型`Int16’所需的大小),并且分配了一个额外的类型标签字节(`UInt8),其值指示为联接字节存储为嵌入的实际值的类型。 类型标签的字节值是联合类型的类型顺序中实际值的类型索引。 例如,类型为"Union"的字段的类型为"0x02"的标签的值。{Nothing, UInt8, Int16}'表示值’Int16’存储在结构内存中字段的16位中。 值'0x01’表示值’UInt8’存储在字段的存储器的16位中的前8位中。 最后,值'0x00’表示将为此字段返回值`nothing',尽管事实上,作为具有该类型的单个实例的单个类型,它在技术上具有0的大小。 类型联合字段的类型标签字节直接存储在计算的字段联合存储器中。

池化内存isbits

Julia现在还可以将isbit union值存储为嵌入在内存中,而不是需要间接单元。 优化是通过存储额外的字节类型标签,每个元素一个字节,以及实际数据的字节来实现的。 这种类型标签存储器执行与类型字段寄存器相同的功能:其值指示实际存储的联合值的类型。 类型标签存储器直接跟随常规数据空间。 因此,访问join数组类型的字节标签的公式如下’a->data+a->length*a->elsize'。