トップページ⇒tech
122コメント35KB

javaプログラムの最適化スレッド

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
sunの糞コンパイラに任せていないで
自分たちで最適化しようぜ的スレッドです。

テクニックを疲労してくれ

参考資料
http://www.google.com/search?hl=ja&safe=off&q=java+%8D%C5%93K%89%BB%81@%83o%83C%83g%83R%81%5B%83h&lr=
0002デフォルトの名無しさんNGNG
-O
0003デフォルトの名無しさんNGNG
疲れきってます。
0004デフォルトの名無しさんNGNG
エクセルソフトのJETってどうよ?
0005デフォルトの名無しさんNGNG
native
0006デフォルトの名無しさんNGNG
-O オプションは付けても付けなくても
ほとんど速度は変わらないって聞いたけど・・・
0007デフォルトの名無しさんNGNG
javacよりもjavaコマンドのオプションのほうが重要マジレス
0008デフォルトの名無しさんNGNG
JITならわかるけどjavaインタープリタで
違いは出るのか?
0009デフォルトの名無しさんNGNG
ひとまずRetroGuardはデフォでしょうね
0010デフォルトの名無しさんNGNG
>>2
javacの-Oオプションは単なるダミーだ。騙されちゃダメだぞ。
0011デフォルトの名無しさんNGNG
for (int i = 0; i < 1000; i++) よりも
for (int i = 999; i >= 0; i--) のほうが速いとか
そういう話でいいですか。
0012デフォルトの名無しさんNGNG
for (int i = 999; i != 0; i--)
のほうがよくない?
0013デフォルトの名無しさんNGNG
要は0と比較するかどうかだから、同じと思われ。こんなんでました。

public void hoge()
{
for(int i = 0; i < 1000; i++);
// 0 0:iconst_0
// 1 1:istore_1
// 2 2:goto 8
// 3 5:iinc 1 1
// 4 8:iload_1
// 5 9:sipush 1000
// 6 12:icmplt 5
for(int j = 999; j >= 0; j--);
// 7 15:sipush 999
// 8 18:istore_2
// 9 19:goto 25
// 10 22:iinc 2 -1
// 11 25:iload_2
// 12 26:ifge 22
for(int k = 999; k != 0; k--);
// 13 29:sipush 999
// 14 32:istore_3
// 15 33:goto 39
// 16 36:iinc 3 -1
// 17 39:iload_3
// 18 40:ifne 36
// 19 43:return
}

ていうか、空ループの削除すらしないとは恐るべしjavac!!
0014デフォルトの名無しさんNGNG
   ● 旦 <age!!
<■V
/ >
0015デフォルトの名無しさんNGNG
良HP晒しあげ

ttp://www.asahi-net.or.jp/~dp8t-asm/java/tips/SpeedOptimizationByCodingIndex.html
0016デフォルトの名無しさんNGNG
>>13
どうせJITかHOTSPOTがやるんじゃないの?<最適化
0017デフォルトの名無しさんNGNG
javaはマルチプラットフォームだから
下手に最適化しないでコンパイルするようになっている
って話だけど、本音としてはただ手抜きしているだけじゃない?

空のループ消したり、重複分の計算を共通式で置き換えたり
するくらいだったら、どのプラットフォームにも
マイナスにならないと思うのだが・・・。
0018デフォルトの名無しさんNGNG
最適化機能がよわいから簡単に逆コンパイルされちゃうんだよね
0019デフォルトの名無しさんNGNG
空ループまで再現されるもんな。(藁
0020デフォルトの名無しさんNGNG
javacアホ決定
Borlandあたりがもう少しマシなjavaコンパイラ作ってくれないかな?
0021デフォルトの名無しさんNGNG
なんでバイトコードコンパイルで最適化せにゃならんのよ。
JITでやってるなら、それでいいじゃん。
やってるかどうか知らんけど。
0022デフォルトの名無しさんNGNG
なんでJITに任せる必要があるんだよ!!
実行時に毎回最適化するなんて無駄だろ?
それにすでにバイトコードに変換されたものより
ソースファイルの段階でコンパイルしたほうが
最適化しやすいんじゃない?
002322NGNG
> ソースファイルの段階でコンパイルしたほうが
> 最適化しやすいんじゃない?

ソースファイルの段階で最適化したほうが
最適化しやすいんじゃないか?

の間違いです
0024デフォルトの名無しさんNGNG
>>13
VJ++で最適化コンパイルした結果
public void hoge(){
//maxstack 2
//maxlocal 2
iconst_0
istore_1
Label1:
iinc 1 1
iload_1
sipush 1000
if_icmplt Label1
sipush 999
istore_1
Label2:
iinc 1 -1
iload_1
ifge Label2
sipush 999
istore_1
Label3:
iinc 1 -1
iload_1
ifne Label3
return
}

>>21
JITで実行される可能性の方が少ないと思われる。
0025デフォルトの名無しさんNGNG
>>24

なんだ。結局javacのコードとたいして
変わらないんじゃん。
このスレ、

「なんでjavaは最適化に消極的なのか?」

に変えようぜ
0026デフォルトの名無しさんNGNG
みみっちい最適化してるうちに、
CPUの速度向上がその最適化の結果を軽く吹き飛ばしてしまうから。
0027デフォルトの名無しさんNGNG
>>25
最適化せずに、より多くの情報を残しておく方が、
JITが最適化しやすいらしい。
#まあ所詮そんのは幻想なんだけど
#まともにインライン展開すらしやしないし

いつかできると言われている、
理想JITコンパイラに期待しましょ。
その時のために最適化はしないでおきましょ。
0028デフォルトの名無しさんNGNG
>>26
そんな甘ったるい思考してるから
いつまでたってもJavaは使えないんだよ。

VC++の鬼のような最適化の、爪の垢でも煎じて飲め。
0029デフォルトの名無しさんNGNG
>>28
使えるかどうかと、実行速度の関係は、もはや強い相関があるとは言えない気がする。
0030デフォルトの名無しさんNGNG
>>26
そのセリフ一昨年聞いた。変わってねーな。
0031デフォルトの名無しさんNGNG
gcjってどうなの?
誰か試した人いる?
0032デフォルトの名無しさんNGNG
JITで最適化とかゆーとるわりに、
バイトコード短くしたほうが明らかに速度上がるんだよな。
感覚的には、バイトコードのサイズに正比例って感じ。
0033デフォルトの名無しさんNGNG
適当に下のコードJava 1.3.1で実行したら、延々と終了せず。
ひょっとしなくても律儀に空ループ回ってると思われ。
Sunご自慢の偉大なるHotSpot様は一体何をやっているのか?

public class Hoge {
  public static void main(String[] args) {
    for (long i = 0; i < 1000000000000000L; i++);
  }
}
0034どうなの?NGNG
http://gcc.gnu.org/java/
0035shigeNGNG
こうやってPerlユーザが馬鹿にされて、コケにされて、侮辱されて、(当然のことだ)
顔を真っ赤にして耐えている姿を想像するだけで俺の気分は爽快になる。

Ruby万歳。俺にこんな快楽を与えてくれたRubyに幸いあれ。
0036デフォルトの名無しさんNGNG
>>35
このスレでいいのか……?
0037デフォルトの名無しさんNGNG
>>36
「javaプログラムの最適化スレッド」
いいと思いますYO!
0038デフォルトの名無しさんNGNG
でもたぶん、このスレだと陵辱されるのはキミだYO!
0039デフォルトの名無しさんNGNG
こんなスレ削除依頼出そうぜ!
0040デフォルトの名無しさんNGNG
35==39
無視して続行しましょう。
顔を真っ赤にして侮辱に耐えてくれ。萌え〜
0041shigeNGNG
みんなでPerlユーザを苛めよう!
みんなでPerlユーザをこの板から追い出そう!
0042shigeNGNG
みんなで叫ぼう!
「Perl使いは死ね!」「Perl使いは死ね!」「Perl使いは死ね!」「Perl使いは死ね!」
「Perl使いは死ね!」「Perl使いは死ね!」「Perl使いは死ね!」「Perl使いは死ね!」
0043オプションの名無しNGNG
>> 33
i < 1000000000Lで計測しました。(-Oなし)
type | 1st | 2nd
gcc2.5.2 | 10.46s | 10.42s
java1.3 | 21.98s | 18.64s
インタプリタの単純ルプーで、これほどまでに速いのでは?
というか...当たり前でしょ?、テスツと呼ぶに値しない。ふっ..
> 13 >ていうか、空ループの削除
はぁ? 最適化というよりもプログラムの意図を捻じ曲げる、創世記以前の産物.
RealTimeでビジーウエイツやターイミングコンーテキスタに使われるかもしれない代物ですぜ。
0044デフォルトの名無しさんNGNG
>>43
この人おもしろすぎ
氷魚ウォッチスレにリンク張ってもいいですか?
0045デフォルトの名無しさんNGNG
いや、あまりおもしろくはないと思うぞ。
0046デフォルトの名無しさんNGNG
じゃあそろそろ誰か結論をまとめてくれ。
0047デフォルトの名無しさんNGNG
>>32
詳細キボーン
0048デフォルトの名無しさんNGNG
>>47
アルゴリズムを工夫しろ、ということです。
0049デフォルトの名無しさんNGNG
>>48
工夫してもどうにもならないのが、糞Javaということです。
0050sunよりNGNG
空ループの削除はしません。

なぜなら、空ループでタイミングをとることも想定しているからです。
手間をかければ空ループの時間も厳密に計測できます。
これらが有効に生かされるのは、組み込み分野です。
0051デフォルトの名無しさんNGNG
>>50
まぁ、そういう事だろうね。
スレッドでスリープかけるより資源が少しで済む。
0052デフォルトの名無しさんNGNG
java固有の最適化って結局、小手先の事か?>1
0053デフォルトの名無しさんNGNG
>>52
そりゃー、「Java固有」って言ってる時点で小手先だろ。
アルゴリズムの見直しによる最適化はJava固有の話じゃないからな
0054デフォルトの名無しさんNGNG
>>50
Sunがそう言ってるんですか?
ソースをクレー、粘土をclay〜

っていうかそれ、javacやJ2SEで空ループなくさない理由に
ならんと思いますけど。空ループウェイトなんて
Write Once, Run Anywhereの建前にも反するし。
0055デフォルトの名無しさんNGNG
>>54
空ループの消去って最適化としてはあまり意味がないと思う。
逆にわざわざ空ループ作るからには、
何かしら意図があってやってるんだろうしね。

そんなのはどうでも良いから、
インライン展開、
サブルーチン展開、
コンスタントプールの最適化、
ローカル変数の最小割り当て、
即値の最適化、
privateメソッドのリネーム
とかもっと積極的にやってくれよ。ゴラァ
0056デフォルトの名無しさんNGNG
>>55
classからの逆変換って結構多用されるから
最適化をしないのはそのあたりも一枚噛んでるかと。
0057デフォルトの名無しさんNGNG
リバースエンジニアリングする人のために最適化しないわけですか?
0058デフォルトの名無しさんNGNG
>>57
リバースエンジニアリングのために最適化しない
という認識でおおかた問題ありません。
0059デフォルトの名無しさんNGNG
Cでなくアセンブラだけで組むような感じで、
javacを全く使わないか、あるいは一旦javacにはかせてから、
生のバイトコードを手で最適化してる人っているのかな?
( RetroGuardとかのツールの開発者じゃなくて、アプリケーションの開発者で)
0060デフォルトの名無しさんNGNG
>>55
サブルーチン展開ってなに?
0061デフォルトの名無しさんNGNG
>>60
小さいサブルーチンをそこに展開しちゃえば
関数呼び出し時のオーバーヘッドがなくなるから
ちょっぴり速くなる。

いうほど高速化は望めない上、これをやられると
あとでデバッグが面倒でたまらないのでやめてほしい。
0062デフォルトの名無しさんNGNG
インライン展開でデバッグが面倒になったりはしないと思うが……。
006362NGNG
じゃないな(あー、眠い)。なんつーかほれ、
開発中はインライン展開しなけりゃいいだけの話。
006462NGNG
>>59
Javaでデモ作ってた人たちはやってたと思う。
バイトコードアセンブラ?はJasminとかあるでよ。
006560NGNG
インライン展開とは違うのですか?
006660NGNG
>>61
006761NGNG
>>65
ただの言葉遊び。

Cとかだとインライン展開しろっていう指示子があったね。
0068デフォルトの名無しさんNGNG
指示しなくても、出来そうなら勝手にやってたね。

実情を知らないのが割り込んですまないが
javaの最適化って、いまのとこ、そんなにしょぼいもんなの?

同じコードがC++とjavaで速度が違うとかだと、
言語の特性もあるからあまり比較に成らんと思うけどね。

どっちかというと、作るコストの方を最適化したい感じだ。
0069デフォルトの名無しさんNGNG
>>60
サブルーチン展開というのは、
javaのバイトコードのjsr命令を使ってメソッド内にルーチンを展開すること。
インライン展開より速度は劣るが、
メソッドコールよりも高速で、
メソッドを定義したりインライン展開するよりもコードサイズを縮小できる。

例えば、以下のメソッドをサブルーチン展開した場合、
void foo()
{
 :
 :
 boo();
 :
 :
 boo();
}

void foo()
{
 :
 :
 jsr boo
 :
 :
 jsr boo

boo:
:
:
 ret
}
0070デフォルトの名無しさんNGNG
60じゃないけどthx

つまり小手先テクニックね。
脱力した。
0071デフォルトの名無しさんNGNG
>>70
小手先じゃないだろ?
メソッド定義やコールに、かなりの無駄が伴うJavaにとっては、
かなり重要なテクだぞ。
0072デフォルトの名無しさんNGNG
つまり、javaの処理系がショボイのね。

gcc3.0に自前の最適化コード入れれば
javaのコードはそのままでいい感じに速くなるかもよ?
0073デフォルトの名無しさんNGNG
javaソースからCソースに変換できるパーサを作ってほしい。
そうしたらgccなりVisualC++なりを使える。
0074デフォルトの名無しさんNGNG
>>73
でもその時点でjavaの理想がいくつか失われるよね

ただのオブジェクト指向型言語になっちゃうよ。
0075デフォルトの名無しさんNGNG
>>73
javaが誕生した当初、javacはcへのコンバータでした
0076デフォルトの名無しさんNGNG
>>75
ほう。
ちょいと、javaしらべてみるかなー。
0077デフォルトの名無しさんNGNG
GCJってどうなったの?
0078デフォルトの名無しさんNGNG
あげ!
0079オプションの名無しNGNG
1.String.+ではなくStringBuffer.addを使え。(SQLは元よりHTML,XML然り)
2.デフォルトコンストラクタではなくサイズを指定できるコンストラクタを設計段階で決定せよ。(ArrayList然り)
3.newをできるだけ使わないパターンを適用すべし。(Flyweight,Proxy然り)
4.予測ではなく実測を重視すること(20-80%というか3%-97%ぐらいか)
5.何でもかんでもsynchronizedを使うな、volatileを使ってくれ、たのむ。
6.SQLのIsolationに何でもかんでもRepatable Readを使うな、ロック制御は発行した
 SQLとJavaで指定したレベルがともに影響することを理解してくれ。お願いだから。
7.finalメソッドでなくてもいいが、せめてprivateメソッドに解体してよ。
8.System.gc()なんて呼ばないでくれ、JavaはC++じゃ無いんだ。
夏休みおわり記念age(6が分かってない奴のせいで苦労した)
0080デフォルトの名無しさんNGNG
>5.何でもかんでもsynchronizedを使うな、volatileを使ってくれ、たのむ。
詳しくきぼ〜ん。
とりあえず無節操synchronizedが深刻にパフォーマンスに影響するのは
分かってるッス。
0081デフォルトの名無しさんNGNG
なんじゃ、Javaでプログラムするとき、
みんなこんなに速度きにしてコーティングしてんの!?
0082shigeNGNG
Ruby
0083デフォルトの名無しさんNGNG
オタクしかいないからでしょ。
0084iアプリ開発者NGNG
バイトコードのサイズも気にするぞ。
0085デフォルトの名無しさんNGNG
iアプリっていつ滅びるの?
0086iアプリ開発者NGNG
明日。
0087デフォルトの名無しさんNGNG
iアプリ終了記念age
0088デフォルトの名無しさんNGNG
マジレス。
しばらくは無くならないだろうね<iアプリ
ケータイばっかいじってる馬鹿な若者どもがいなくならない限り。
0089デフォルトの名無しさんNGNG
今日もちっちゃい画面見ながらピッピッピ〜
009079じゃないけどNGNG
>>80
あくまでおいらの経験談だけど、

プリミティブ変数のマルチスレッド同期を取りたいだけなら、
volatile変数にすることで十分達成される。
synchronizedだと、性能以前に、予期しないデッドロックが
発生するリスクがある。

コードを作った本人はともかく、メンテで放り込まれた場合
synchronizedが入り乱れたマルチスレッドプログラムは恐怖の的。
変更すると、見当もつかないところで急に動かなくなったりする。
0091デフォルトの名無しさんNGNG
javaで文字列操作のプログラムをつくる場合
StringやらStringBufferを使うより
自分でcharなり(アルファベットのみなら)byteなりを使った方が
高速なプログラムになるのでしょうか?
0092デフォルトの名無しさんNGNG
デッドロックを検出するにはどうしたらいいかな?
0093名無しさん@NGNG
iアプリってさ、いっくらいいもんつくっても、
けっきょくもうかるのはドコモだよね?
0094shigeNGNG
        ______
     ヾ/::::::::::::::::::::::::::ヾヽ
     i:::::::::(((((((((⌒);)  湿度の高いジメジメとした熱帯夜の中
      |:::::::/        .iノ   >>1はおもむろにパンツの中から
      |::::/    ヘ  / |   己のイチモツを取り出した!
    ,⊥|:|----(=・)-(=・)   まだ、実戦経験がないためか?
    l  !:; ∪  ⌒´⊃` |     亀頭の色彩は綺麗なサーモンピンクだ
    ゝ_┃     ´___/
       |┗━⊃<二二y'      ハードディスクの7割を占めようかという
      |   \_二/      ロリ画像の数々……
    /ト、   /7:`ヽ、_     さぁ今日のオカズは何だ?
  /::::::::| ~''x‐''''~~ /::::::::::::::`ー 洋物か?あるいは国産か!?
/::::::::::::::::| ,,イ;;;;>、 /:::::::::::::::::::::::::: 少女のまだ未発達の肉体が
::::::::::::::::::::::| /:::::| /:::::::::::::::::::::::::::::::  鬼畜な>>1のリビドーを刺激する!

人差し指と親指で作ったイチモツへのエンゲージリングを
己のペースで……まるで太鼓を叩く猿のオモチャのような激しい上下の反復運動

ああーーーーと!ここでアクシデント発生だぁーーーーー!!!
なんとティッシュボックスの中が空っぽだ!!
>>1の亀頭から無色透明な先走り汁が溢れ出す!
んっ!?……まさか、まさかっ!そのまま出すのかーー!?
この男は、たった一瞬の快楽のためにそこまでのリスクを犯すのか?

ああっと>>1はどうやら覚悟を決めたようだ、その表情は心なしか落ち着いている
自分の運命を覚悟した神風特攻隊のような清々しい漢(おとこ)の顔だ
あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛っと!!!!!!
滑らかな放物線を描き母と父から受け継いだ濃厚なザーメンが
>>1のキーボードとディスプレイを直撃するーーーーーーーーーーーっ!!!
0095デフォルトの名無しさんNGNG
javaで文字列操作のプログラムをつくる場合
StringやらStringBufferを使うより
自分でcharなり(アルファベットのみなら)byteなりを使った方が
高速なプログラムになるのでしょうか?
   
0096デフォルトの名無しさんNGNG
それくらい試せよ。
0097dqwdqwdqwdqwdqwdqwdqNGNG
っっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっっk
0098デフォルトの名無しさんNGNG
>それくらい試せよ。
どうやって?
0099デフォルトの名無しさんNGNG
>>98
文字列処理。
つーか、そういってんじゃん・・・
0100デフォルトの名無しさんNGNG
>99
??

どうやってパフォーマンスをはかるんだ?
って意味じゃね〜の?
0101デフォルトの名無しさんNGNG
そんな事気にする奴はJava使うな
0102デフォルトの名無しさんNGNG
>>100
1万回くらいのループの時間計測、かなぁ。
何を1万回? いやーいろいろ
0103デフォルトの名無しさんNGNG
>>95
StringとStringBufferのソース見て、それより高速化できるか
考えてみれば?
0104デフォルトの名無しさんNGNG
>>85
つーか、そのうちチャットのマイサーバを携帯端末で動かすような
そんなiアプリの時代がやってくると思われ
それがJavaなのかC#なのかはしらんが
0105近所のバカNGNG
あははは あははは あははは あははは

あははは あははは あははは あははは

ちょっと質問なんだが

あははは あははは あははは あははは

あははは あははは あははは あははは

Win NTにJDKをインストールする際、コントロールパネルを起動し
(環境)を選択して(ユーザー環境変数)と(システム環境変数)で
(PATH)を探します。パスを追加する場所がわからないときは、
ユーザー変数の(PATH)の最後に追加します。

C:\jdk1.2\bin


ってのがあるんだけど、どうやんの?

あははは あははは あははは あははは

あははは あははは あははは あははは
0106デフォルトの名無しさんNGNG
>>105
その説明でわからなければ、こちらへどうぞ
http://natto.2ch.net/pcqa/index2.html
0107近所のバカNGNG
あははは あははは あははは あははは

あははは あははは あははは あははは

私はJAVAの初心者だけであって
コンピューターの初心者ではないよ。

あははは あははは あははは あははは

あははは あははは あははは あははは
0108デフォルトの名無しさんNGNG
>>107
JDKは普通何種類も用意しておくものだから
環境はbatファイルで用意しておくものだから
0109デフォルトの名無しさんNGNG
環境変数やパスの通し方を知らなくても
「コンピューターの初心者ではない」とノタマエる時代になったんだね
コンソール概念は過去の遺物ですか?
思えば遠くにきたモンダ
0110近所のバカNGNG
あははは あははは あははは あははは

あははは あははは あははは あははは

で、どうやんの?

あははは あははは あははは あははは

あははは あははは あははは あははは
0111デフォルトの名無しさんNGNG
>>110
パスを追加するバッチファイルを用意すればいいよ。
0112デフォルトの名無しさんNGNG
馬鹿はJavaやらないで下さい
0113shigeNGNG
馬鹿はJavaでもやっといてください(藁)
0114近所のバカNGNG
あははは あははは あははは あははは

あははは あははは あははは あははは

バカだから聞いてんのに、答えになってないよ。

あははは あははは あははは あははは

あははは あははは あははは あははは
0115デフォルトの名無しさんNGNG
>>114
Java実行できるようになったか?
0116デフォルトの名無しさんNGNG
やっぱこっち逝った方がいい気がする
http://natto.2ch.net/pcqa/index2.html
0117デフォルトの名無しさんNGNG
>StringとStringBufferのソース見て、それより高速化できるか
>考えてみれば?
ソースなんてあるんですか?
JDKをダウンロードすると付いてくるのですか?
0118デフォルトの名無しさんNGNG
>>117
そうです。src.jarを解凍してみそ。
0119デフォルトの名無しさんNGNG
何でそんな事知ってるんですか?
世の中物知りが多いなー
0120デフォルトの名無しさんNGNG
>>119
それは失礼な発言だってことに気がついているか?
0121デフォルトの名無しさんNGNG
なぜ?
0122デフォルトの名無しさんNGNG
>>120 は失礼。
■ このスレッドは過去ログ倉庫に格納されています