vecmathとの比較

Last-modified: 2006-04-04 (火) 00:04:21

Java3D vecmath のデザイン

http://www.objectclub.jp/download/vecmath1
↑のページから抜粋してます

1、すべてのメンバ変数が 'public' である.
2、すべてのメソッド(メンバ関数)が 'final' (non-virtual) である.
3、Matrix や Vector 中に,配列の表現を持たない.
4、Point と Vector が別クラスとして区別されている.

という特徴があります.(1)-(3)の設計は,もともと Java の速度上の問題から決定されたと思われます.(1) はオブジェクト指向的にあるいはスレッドセーフ的に良くないスタイルのように見えますが,必要であれば上位でカプセル化することができます(実際 Java3D の SceneGraph ではラッパを作っています). (2) はサブクラス化の際に問題になるかもしれませんが,1つ1つのメソッドが明確で自然な仕事をしているため,セマンティクスの一貫性は保たれるでしょう. (3)は for/while ループと添字による要素アクセスがないため,ライブラリコードの増大をもたらす可能性があります.しかし実際に実装してみるとそうでもないことに気付きました.また,これがこのライブラリの最大の特徴である速度を稼ぐポイントとなっています.また,(4) はとてもよい設計判断だったと思います.コードがセマンティクス的に一貫し,可読性も向上します.

Tanpopでは

Tanpopoの数学関数はvecmathの思想をそのまま流用しようと思います。
ただし、vecmathでは汎用性を考えて、オブジェクト指向で設計されているため、継承関係にあるクラスがいくつかあります。その際spuerなどの関数を呼び出すのに少し時間がかかってそうなので、そこら辺は改善して生きたいと思います。

vecmathとの比較

vecmathのvecter3Dと自分が作ったCtVector3Dとの動作の比較
大体おんなじくらいの動作をしてくれます、一部はvecmathより早い部分もあります♪
Profiling

PackageBase Time(seconds)Cumulative Time (seconds)Calls
typesComp73.89759173.947711
CtVctorr3DTest73.89759173.947711
main(java.lang.String[]) void73.89759173.947711
org.tanpopo.library.types0.0254290.02542916000
CtVector3D0.0254290.02542916000
mod(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D0.0029850.0029851000
add(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D0.0029210.0029211000
div(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D0.0028840.0028841000
mul(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D0.0028250.0028251000
sub(org.tanpopo.library.types.CtVector3D) org.tanpopo.library.types.CtVector3D0.0027230.0027231000
"CtVector3D(float float float)"0.0016020.0016022000
normalize() void0.0014440.0014441000
assignmod(org.tanpopo.library.types.CtVector3D) void0.0013160.0013161000
Magnitude() float0.001150.001151000
assignadd(org.tanpopo.library.types.CtVector3D) void0.0010120.0010121000
assigndiv(org.tanpopo.library.types.CtVector3D) void0.0009990.0009991000
assignsub(org.tanpopo.library.types.CtVector3D) void0.0009570.0009571000
assignmul(org.tanpopo.library.types.CtVector3D) void0.0009490.0009491000
Magnitude2() float0.0008490.0008491000
equals(org.tanpopo.library.types.CtVector3D) boolean0.0008150.0008151000
javax.vecmath0.0166280.01662812000
Vector3f0.0119560.0119567000
"Vector3f(float float float)"0.0060670.0060672000
"cross(javax.vecmath.Vector3f javax.vecmath.Vector3f) void"0.0014690.0014691000
normalize() void0.0014080.0014081000
length() float0.0010820.0010821000
lengthSquared() float0.0010130.0010131000
dot(javax.vecmath.Vector3f) float0.0009160.0009161000
Tuple3f0.0046720.0046725000
add(javax.vecmath.Tuple3f) void0.001040.001041000
sub(javax.vecmath.Tuple3f) void0.0009910.0009911000
"add(javax.vecmath.Tuple3f javax.vecmath.Tuple3f) void"0.0009760.0009761000
"sub(javax.vecmath.Tuple3f javax.vecmath.Tuple3f) void"0.0009120.0009121000
equals(javax.vecmath.Tuple3f) boolean0.0007530.0007531000
java.lang0.0068660.00686616
ClassLoader0.0068660.00686616
loadClassInternal(java.lang.String) java.lang.Class0.0067530.0067539
"checkPackageAccess(java.lang.Class java.security.ProtectionDomain) void"0.0001130.0001137
java.io0.0011960.0011962
PrintStream0.0011960.0011962
println(java.lang.String) void0.0011960.0011962