簡體   English   中英

Scala中快速打包的結構數組

[英]Fast packed arrays of structs in Scala

我正在研究如何將現有的混合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

由於Numpy,這些可以在Python和C ++之間來回轉換而無需復制。

在JVM上,由於未裝箱的數組只能有少量類型,我能想象的唯一方法是為每個結構創建(1)盒裝Scala類型,例如Vector<double,3>和(2)a typed Array[Double]周圍的瘦包裝器知道它應該是什么結構,並根據需要創建/使用盒裝單例。

是否有任何現有的庫可以執行此類操作,或者為打包的結構數組實現任何替代方法? 有沒有人有關於性能特征可能是什么的經驗,以及現有編譯器和JVM是否能夠在至少非多態密封盒中優化盒子?

請注意,打包和不錯的打字不是可選的:如果沒有打包,我會很快打擊內存,如果我只有陣列[雙] 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實現Iterator ,將其自身作為next ,或者在您希望易用性而非效率的情況下進行各種其他操作。

但重點是,如果你願意自己管理這些適配器的創建和移動,你不需要擔心裝箱。 您只需創建一次“盒子”,然后它會跳轉到您需要的任何位置。

如果你滿足於C ++的2倍以內的性能,並且目標是單線程使用,那么應該這樣做。 (過去它對我有用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM