VMD読み込み実装中・・・

何故かとてつもなく遅くなってしまった。
これは看過できないが、なぜだか良くわからん。
一度Array[Byte]にファイルを全部読みこんだあとにデータを切り出しているだけなのだが、
12000フレームくらいのデータをFloatとかフォーマットどおりの型に
しているだけで数十秒がかかる(配列に格納してすらいない)。
しかもCPU100%。
java的にダサい書き方のところがどっかにあるのだろうが見当がつかんな。。。

心当たり発見

毎フレームnew Stringがあるのがよろしくないと気付いた。
これ↓

String(byte[] bytes, int offset, int length, String charsetName) 

を各フレームについて毎回呼んでいる。
そりゃ遅かろうと。
これは、Array[Byte]をベースに俺俺Stringを作るべきだな。
また、車輪の再発明ができるな。

実装してみた

こんな感じ。一瞬で終わるようになった。
そういえば、JavaのStringは字面が同じものは同じ実体を参照するんだっけ?
CP932からUnicodeへの変換と、同一文字列の検索を毎回やってたらそりゃ遅くなるだろう。

package trigonal.loader
import java.nio.charset.Charset

class ByteString(val buf :Array[Byte]){
    override def toString() :String=new String(buf, Charset.forName("MS932"))
    override def equals(other :Any) :Boolean={
        other match {
            case o :ByteString => buf.equals(o.buf)
            case _ => false
        }
    }
}

object ByteString {
    def apply(src :Array[Byte], start :Int, length :Int)
        :ByteString={
        val buf=new Array[Byte](length)
        var pos=start
        for(i <-0 until length){
            buf(i)=src(pos)
            pos+=1
        }
        new ByteString(buf)
    }

    def apply(src :String) :ByteString=apply(src.getBytes)
    def apply(src :Array[Byte]) :ByteString=apply(src, 0, src.length)
}