MATSUZAKIの日記 RSSフィード Twitter

Back to Peppermint.jp

2011-11-24

Js_of_ocamlでaobench

なんかAO Benchが続く。

画像処理をブラウザでやりたかったけれど、JavaScriptが1000行近くなったあたりで面倒になってきたので、http://d.hatena.ne.jp/camlspotter/20111015/1318664763を見てそのうち試そうと思ってたJs_of_ocamlを試してみた。

とりあえずざっくり実行速度見てみるために、http://d.hatena.ne.jp/h013/20110625/1309114394のaobenchを移植。

といっても基本的に変更なしでCanvas描画を付け加えるだけで動いた。つまらん。

http://peppermint.jp/temp/ao/

プロファイルとって見ると、Random.floatがOCamlでの実装をJSコンパイルしたものになって重い様子なのでMath.randomを呼ぶように変更した。

let rnd f:float =
  let r = Js.Unsafe.meth_call (Js.Unsafe.variable "Math") "random" [||] in
  r *. f

調子に乗って画像のfloat配列もFloat32Arrayに置き換えてみたけれど、AOのループの外でしかアクセスしないせいかあんまり影響なかった。

後は、普通にレイトレの処理に時間を食ってるようだ。vdotはインライン展開してくれてもいい気がするけど、そのままでもtracing treeで展開されるんだっけ。

ocamloptでコンパイルしたものに比べると半分くらいの速度だけど、バイトコード実行よりはだいぶ早い。

2011-07-29

Scalaでaobench

windows-x64 1.7.0 で前回と同じ https://gist.github.com/1029695 を実行。

$ cat /proc/cpuinfo
model name      : Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz
$ echo $JAVA_HOME
C:\Program Files\Java\jdk1.7.0\

$ scala -J-server jp.peppermint.vec.immutable.App
List(1780, 1750, 1758, 1748, 1761)
1756.3333333333333

$ scala -J-server jp.peppermint.vec.mutable.App
List(1717, 1687, 1681, 1685, 1684)
1685.3333333333333
$ echo $JAVA_HOME
C:\Program Files (x86)\Java\jdk1.7.0\

$ scala -J-server jp.peppermint.vec.immutable.App
List(2150, 2145, 2146, 2153, 2138)
2147.0

$ scala -J-server jp.peppermint.vec.mutable.App
List(2111, 2097, 2090, 2091, 2087)
2092.6666666666665

前回のベンチマークではP8700 @ 2.53GHzでjdk1.6.0_18で実行した結果ではimmutableのほうが格段に遅かったけれど、6u26と1.7.0のどちらもimmutable版だからといって半分の速度になったりはしない。

5%〜15%程度の違いなら一時オブジェクト使ってimmutableに書くほうが楽そう。

2011-06-16

Scala

ScalaでのNumericの動作を教えてもらったのでベクトル計算のベンチマークをAO Benchでとってみた。

ソースはgithubhttps://gist.github.com/1029695

イミュータブル

素直に数式を書けるように定義してみる。

case class Vec3d(x:Double, y:Double, z: Double) {
  def +(v: Vec3d) = Vec3d(x + v.x, y + v.y, z + v.z)
  def -(v: Vec3d) = Vec3d(x - v.x, y - v.y, z - v.z)
}

def ray_sphere_intersect(isect: Isect, ray: Ray, sphere: Sphere) {
  val rs = ray.org - sphere.center

  val B = rs * ray.dir
  val C = rs * rs - sphere.radius * sphere.radius
  val D = B * B - C
  …
}
$ scala -J-server jp.peppermint.vec.immutable.App
List(9494, 9508, 9448, 9471, 9445)
9471.0

Java版(http://leonardo-m.livejournal.com/79346.html)の半分くらいの実行速度。

ミュータブル

2オペランドのような感じで中間オブジェクトの生成を抑えてみる。

class Vec3d(var x:Double = 0, var y:Double = 0, var z: Double = 0) {
  def this(v: Vec3d) =
    this(v.x, v.y, v.z)

  def +=(v: Vec3d) {
    x += v.x
    y += v.y
    z += v.z
  }
...
}

def ray_sphere_intersect(isect: Isect, ray: Ray, sphere: Sphere) {
  val rs = new Vec3d(ray.org)
  rs -= sphere.center

  val B = rs * ray.dir
  val C = rs * rs - sphere.radius * sphere.radius
  val D = B * B - C
...
$ scala -J-server jp.peppermint.vec.mutable.App
List(3846, 3853, 3854, 3833, 3840)
3846.3333333333335

ほぼJava版と同じ。

イミュータブル ジェネリック

ベクトルの要素を型パラメータで変えられるように。

case class Vec3[T](x: T, y: T, z: T)(implicit num: Fractional[T], real: Real[T]) {
  import num._
  import real._

  def +(v: Vec3[T]) = Vec3[T](x + v.x, y + v.y, z + v.z)
  def -(v: Vec3[T]) = Vec3[T](x - v.x, y - v.y, z - v.z)
$ scala -J-server jp.peppermint.vec.immutable.gen.App
List(20906, 20901, 20805, 21094, 21006)
20937.666666666668

だいぶ遅い。ボクシング・暗黙の型変換でのラッパクラス生成・interface経由のメソッドコールあたりが原因かな?

まとめ

プリミティブ型もジェネリックにできるとはいえレンダラの中でループぶんまわす用途には向かない様子。イミュータブルにするのは記述性や汎用性とのトレードオフでありかもしれない。

追記

64bit JVMでは特性が違うようなので後で調査

2010-11-06

Emacsのつづき

環境変数の設定。

export LANG=ja_JP.UTF-8
export TMPDIR=/data/emacs/tmp
export TERM=vt100
export TERMINFO=/data/emacs/share/terminfo
export HOME=/storage

diredがGNUlsじゃないと挙動がおかしいのでls-lisp.elを使うように設定。

(setq ls-lisp-use-insert-directory-program nil)

デフォルトのConnectBotだとCTRL/ALT/Fnのハンドリングがハードウェアキーボード親和性がいまいちなのでパッチを当てる。

http://peppermint.jp/products/android/

ConnectBotのLocal接続だと起動後数十分でいきなり接続切れるのはなんでだろう…。

追記

どうもWiFiが切れるタイミングで全接続を切ってるようなので、ネットワークを使わない接続は切らないようにした。

2010-11-04

Emacs for Android

git://git.savannah.gnu.org/emacs.git のコードをNDKでコンパイルした。

http://peppermint.jp/products/android/emacs24-android-20101104-2326.tar.bz2

$ cd /
$ tar xjf emacs24-android-20101104-2326.tar.bz2
$ /data/emacs24/bin/emacs

f:id:MATSUZAKI:20101104234906j:image

emacs-dumpすると落ちるので、CANNOT_DUMPでビルドしてるせいで起動にしばらくかかる。