たま~に色々書き込む所
Posted by ユハニ - 2010.06.01,Tue
元々C/C++のプログラマーの私ですが、最近あるプロジェクトの関係でJavaで開発してます。
結構いい所もあります!
前に作ったドメインのサブドメインを削る簡単な文字列の処理のプログラムがありますが、この同じプログラムをJavaで書いたら、10倍重かった!
まあ、普通だったら、全体の内でどうでもいいでしょうが、この場合はその関数は一つのリクエストで何百万回呼ばれる事もありうる。700万行がCで2秒以下で出来た物がJavaで22秒かかりました。 これはまずい。 で、Javaの問題では。 Cのようなポインターアリスメチックは出来ないけど、Javaってそこまで遅くはないよ。
最終結果: Cとほぼ同じスピードに削れました!
それはどう出来たのでしょう?
・まずはEclipseで使えるJavaのプロファイラーをインストールしました。
TPTPは直接Eclipseの環境にプラグイン出来る高性能のプロファイラー。 セットアップが困難な場合もありますが、入れると助かります。
・一回プロファイラーで回してネックの所を探した。
・意外な事に一番ネックがロジックの所ではなくスタート時点にあった!?
・実はString.splitとString.formatが犯人だった。
まず、String.formatの代わりにStringBuilderを使う事で処理が半分になりました! おおお。正直最初からそうするべき物だったけど、そこまで差があるとは思わなかった。
そしてString.splitをどうにかしなければならなかった。大変便利な関数ですが、二つの問題があります:
・すべてのサブパーツの文字列を作成する。いらない物も。
・簡単な処理でも一応正規表現を使ってる。
その代わりにString.indexOfとlastIndexOfを使って、欲しい部分を見つかり、String.substring出取得する事にすると、何と処理時間がど〜んと落ち、Cとほぼ同じになった。
覚える事:
最適化はプロファイラーから始めよう。 自分がボトルネックになってると思ってる所と実際の問題点がよく違ったりする。 また、よく言われるのは90%のスピードアップが10%のコードの最適化で得られる。
また、「最適化は燃えるぞ!」
PR
Comments
Post a Comment
カレンダー
ブログ内検索
プロフィール
HN:
ユハニ
性別:
非公開
職業:
プログラマー
自己紹介:
サムファクのプログラマーの一人。
C++とかでの最適化などが好き。
後は音楽を聞く・弾く、や漫画読書。
いつかは世界征服を目指したいかも。
C++とかでの最適化などが好き。
後は音楽を聞く・弾く、や漫画読書。
いつかは世界征服を目指したいかも。
Template by mavericyard*
Powered by "Samurai Factory"
Powered by "Samurai Factory"