Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Scala中结构的快速压缩数组_Arrays_Performance_Scala - Fatal编程技术网

Arrays Scala中结构的快速压缩数组

Arrays Scala中结构的快速压缩数组,arrays,performance,scala,Arrays,Performance,Scala,我正在研究如何将现有的混合Python/C++数字代码库转换为混合Scala/C++代码库,从长远来看,理想情况下主要是Scala代码库。我认为最大的问题是结构的压缩数组。例如,在C++中,我们有类似的类型。 Array<Vector<double,3>> # analogous to double [][3] Array<Frame<Vector<double,3>>> # a bunch of translation,quatern

我正在研究如何将现有的混合Python/C++数字代码库转换为混合Scala/C++代码库,从长远来看,理想情况下主要是Scala代码库。我认为最大的问题是结构的压缩数组。例如,在C++中,我们有类似

的类型。
Array<Vector<double,3>> # analogous to double [][3]
Array<Frame<Vector<double,3>>> # a bunch of translation,quaternion pairs

这些可以在Python和C++之间来回转换而不用复制。 在JVM上,由于未装箱数组只能有少数类型,因此我可以想象的唯一方法是为每个结构创建1个装箱Scala类型,例如Vector,2在数组[Double]周围创建一个类型化的瘦包装器,它知道它应该是什么结构,并根据需要创建/使用装箱单例

是否有任何现有的库可以做这样的事情,或者为结构的压缩数组实现任何替代方案?是否有人有过关于性能特征可能是什么的经验,以及现有编译器和JVM是否能够至少在非多形、密封的情况下优化这些框


请注意,打包和漂亮的键入不是可选的:如果不打包,我会很快耗尽内存,如果我所拥有的只是Array[Double]C++的类型系统不幸获胜。

问题真的是里面除了数字之外是否还有其他内容。如果只是一堆双打,你可以用Scala编写一个包装器,但你不应该指望避免拳击。相反,考虑编写可变包装:

trait Vec3 {
  def x: Double
  def y: Double
  def z: Double
}
class ArrayedVec3(array: Array[Double]) extends Vec3 {
  private[this] var index = 0
  def goto(i: Int) = { index = i*3; this }
  def x = array(index)
  def y = array(index+1)
  def z = array(index+2)
}
您可以让ArrayedVec3实现迭代器,将自身返回为下一个迭代器,或者在需要易用性而不是效率的情况下执行其他各种操作

但关键是,如果你愿意自己管理这些适配器的创建和移动,你就不需要担心拳击。您只需创建一次长方体,然后它就会跳到您需要它的任何地方


<>如果你对C++中的~2x的性能满意,并且目标是单线程使用,这应该是个办法。在过去,它对我很有效。

使用值类,您可以执行此技巧的一种变体,并非常接近C性能