創造と開発ノート
JavaTips
最終更新:
匿名ユーザー
-
view
JavaTips
ここではロボットの開発に関係ありそうなJava言語のTipsを紹介しています。
数値演算に関するTips
分数の扱い方
Javaの標準APIでは分数を扱うことはできませんが、Apache JakartaプロジェクトのCommons LangのFractionというクラスを使えば扱えるようになります。
[参考サイト(分数を扱う)|http://www.graco.c.u-tokyo.ac.jp/~haruri/prog/java_misc.xhtml]
[Jakarta Commons Lang|http://jakarta.apache.org/commons/lang/]
[参考サイト(分数を扱う)|http://www.graco.c.u-tokyo.ac.jp/~haruri/prog/java_misc.xhtml]
[Jakarta Commons Lang|http://jakarta.apache.org/commons/lang/]
スレッドに関するTips
Timerを使おう
Timerクラスを使うとThreadに比べてスレッドの処理がわかりやすくかけるだけでなく厳密な周期処理などきめの細かい制御を行うことができます。
最適化に関するTips
以下は最適化、つまりプログラムのパフォーマンスを最も高くなるよう改善する方法に関するTipsです。
最適化のテクニックは、使い方によってパフォーマンスは良くなってもソースの可読性が悪くなることがありますので、むやみに使わず適材適所、特にボトルネックに使うことをおすすめします。
最適化のテクニックは、使い方によってパフォーマンスは良くなってもソースの可読性が悪くなることがありますので、むやみに使わず適材適所、特にボトルネックに使うことをおすすめします。
数値演算はbyteよりintの方が効率が良い
Javaの場合、整数の操作はint型を使用すると一番効率が良いようにVMが設計されているそうです。
C言語出身者やアセンブラ狂の場合つい演算にbyteを使いたくなりますがそうではないようです。
C言語出身者やアセンブラ狂の場合つい演算にbyteを使いたくなりますがそうではないようです。
forループの条件は0と比較するようにする
これも上記のサイトの引用ですが、forループ等において終了条件の判定を行う場合、通常良く行うのが以下のようなコーディングです。
for(int i=0;i<size;i++){...}
これを増加型ループと呼ぶことにします。
しかし、参照の順番が重要でない場合は下記のように書く方が高速に動作します。
これを上記に対し減少型ループとします。
しかし、参照の順番が重要でない場合は下記のように書く方が高速に動作します。
これを上記に対し減少型ループとします。
for(int i=size;i>0;i--){...}
[[参考サイト>http://www.asahi-net.or.jp/~dp8t-asm/java/tips/SpeedOptimizationByCoding.html
]]によると後者が約8%高速に動作したようです。
速度の違いは比較部分が0と比較しているか、sizeと比較しているかが大きく関わっているようです。
比較対照が0の場合はバイトコード(アセンブラ)レベルで0比較のコードを採用されるため、1ステップで処理が済みます。ループのような繰り返しの場合全体のパフォーマンスとして性能の違いが見えてくるようです。
しかし、言うまでもなく繰り返しの順番(iが増加するか、減少するか)が重要な処理には使えません。
]]によると後者が約8%高速に動作したようです。
速度の違いは比較部分が0と比較しているか、sizeと比較しているかが大きく関わっているようです。
比較対照が0の場合はバイトコード(アセンブラ)レベルで0比較のコードを採用されるため、1ステップで処理が済みます。ループのような繰り返しの場合全体のパフォーマンスとして性能の違いが見えてくるようです。
しかし、言うまでもなく繰り返しの順番(iが増加するか、減少するか)が重要な処理には使えません。
ちなみに、Tigerから採用された拡張for文では以下のようなコードを使いますが
Integer array[] = new Integer[100]; ...; for(Integer i : array)System.out.print(i);
これをJadを使って逆コンパイルすると
Integer array[] = new Integer[100]; ...; int j=0; for(int k = array.length; j < k; j++){ Integer i = array[j]; System.out.print(i); }
のように増加型のループになってしまうようです。