忍者ブログ
たま~に色々書き込む所
Posted by - 2024.11.24,Sun
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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
Name :
Title :
E-mail :
URL :
Comments :
Pass :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
TrackBack URL
TrackBacks
カレンダー
バーコード
ブログ内検索
プロフィール
HN:
ユハニ
性別:
非公開
職業:
プログラマー
自己紹介:
サムファクのプログラマーの一人。
C++とかでの最適化などが好き。
後は音楽を聞く・弾く、や漫画読書。

いつかは世界征服を目指したいかも。
Template by mavericyard*
Powered by "Samurai Factory"
忍者ブログ [PR]