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描画を付け加えるだけで動いた。つまらん。
プロファイルとって見ると、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で展開されるんだっけ。
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でとってみた。
ソースはgithubに https://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がGNUのlsじゃないと挙動がおかしいのでls-lisp.elを使うように設定。
(setq ls-lisp-use-insert-directory-program nil)
デフォルトのConnectBotだとCTRL/ALT/Fnのハンドリングがハードウェアキーボードと親和性がいまいちなのでパッチを当てる。
http://peppermint.jp/products/android/
ConnectBotのLocal接続だと起動後数十分でいきなり接続切れるのはなんでだろう…。
