前回までのお話taichiw.hatenablog.comたった一行、乱数の初期化をループの中からクラス生成時に移しただけで5倍も速くなったというお話でした。クラス変数にしたらNewが減るじゃん!ということでstaticをつけてみました。SecureRandom();結果。Classがロードされるタイミングで一回だけNewする場合)クラス変数のほうがギザギザしていて、天井に張り付いて『ない』気が。いうことは、マルチスレッド間でアクセスの待ちが発生している?と思い調べてみると、案の定でした。{こいつがsynchronized。いうことで、マルチスレッド間で1インスタンスを共有した結果、メソッドにロックがかかって待ちが発生し、遅くなってしまっていたのでした。SecureRandomをやめたら...これまで、なんとなくSecureRandomクラスを使っていたのですが*1、改めて見るといかにも「Secureを得るために速度を犠牲にしている」っぽい名前です。そこで改めて確認したところ、SecureRandomクラスの他に、単なるRandomクラスが存在しました*2。Randomクラスで用いられている乱数生成アルゴリズムは予測可能であるために、暗号などには使えないそうなのですが、別に暗号を作っているわけではないのでこれで十分。いうことで、ただのRandomクラスに差し替えてみます。速くなった!!しかも、クラス変数でも、インスタンス変数でも、はたまたループ内で都度生成されるメソッドローカルな変数でも、ほぼ実行時間が変わらないという。要は、SecureRandomの生成が遅かったのか...。試しに乱数を使うのをやめてみました*313秒、11秒、11秒、12秒、...ということで、10秒前後縮まりました。乱数って用法・容量を守って正しく使わないとコワイですね。乱数」でググって見つけたソースを適当にコピペしてました。*2:Listなどの感覚だとClassとInterfaceのように見えますが、どちらもClass。SecureRandomはRandomを継承したクラスです*3:打席の結果が毎回同じなので、シミュレータとしては意味をなさなくなっています。「データしか持たないデータクラスは作らない...こちらの本を読んででのレポートです。今年もJavaDayTokyoに出席させていただきました。読者になる検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro最新記事awkで特定の列を除外して出力するWindows10にOracleをインストールしようとしたらありがちな罠にハマった古いプログラムからも学ぶことがある...と思う。#rtechconf月別アーカイブ参加グループプログラミングインターネットテクノロジーはてなブログをはじめよう!taichiwさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。