Androidスピード

android-speed.png

同じ計算をするなら小さい型の方が速い

速度的には

short<int<float<long<double

の順で速さが変わる。
shortが一番速い
特に、longやdoubleのような64ビットのものは時間がかかる。

ソートの速さ

また、shortとそれ以外では使われているソートアルゴリズムが違う
short 線形時間でソートする数え上げソート
int,long クイックソートの一種

FloatMathを使う(API Level8以下ならば)

描画周りでは基本float型を使う。doubleは使えない。
三角関数を使うときはFloatMathを使った方がdouble縛りのMathを使うより速い。ただし、用意されている関数の種類は少ない

  • ceil(float value)
  • cos(float angle)
  • exp(float value)
  • floor(float value)
  • hypot(float x, float y)
  • pow(float x, float y)
  • sin(float angle)
  • sqrt(float value)

Returns the closest float approximation of the square root of the argument.
ただしAPI Level8以上ならば普通のMathを使った方が高速である

GetterやSetterはさけてpublicメンバ変数にしよう

C++ のようなネイティブ言語では、ゲッター ( 例、 i = getCount() ) を使用して、直接フィールドにアクセス ( i = mCount ) しないのが一般的な習慣となっています。これは、通常はコンパイラがアクセスをインライン化し、必要に応じてアクセス制限したりフィールドをデバッグしたりする必要が生じた場合に、いつでもコードに追加できることから、 C++ では優れた習慣です。

Android では、これがまずい考えです。実際のメソッド呼び出しは、フィールドの呼び出しに比べはるかに負担がかかります。オブジェクト指向言語のプログラミング手法に従い、ゲッターとセッターを public のインターフェイスで持たせるのが理にかなっていますが、クラスの中では常にフィールドに直接アクセスすべきです。

JIT がない場合、直接フィールドにアクセスする方が、平凡なゲッターの呼び出しに比べて 3 倍速くなります。JIT がある場合 ( JIT があると直接フィールドにアクセスするのはローカルにアクセスするのと同じくらいわずかな負荷で済みます ) 、直接フィールドにアクセスする方が、平凡なゲッターの呼び出しに比べて 7 倍速くなります。Froyo がそれに該当しますが、将来的には JIT が getter メソッドをインライン化したときに改善されることになります。

できるだけStatic関数にする

仮想よりも Static を優先する
オブジェクトのフィールドにアクセスする必要がない場合は、そのメソッドを static にしてください。
呼び出しが 15% から 20% 速くなります。
またメソッドのシグニチャーからそのメソッドがオブジェクトの状態を変化させないということを知らせることができるので方策です。


speed

サポートサイト Wikidot.com speed