noteプログラミング関連2015-01-30メモ:java.util.concurrent.RecursiveTaskのFibonacciJavaJava7で導入されたFork/Joinフレームワークの中に、java.util.concurrent.RecursiveTaskというクラスがあります。これは、再帰を使用して計算を行った結果を生成するためのForkJoinTaskの実装です。このクラスのAPIドキュメントのページを見ると、例としてフィボナッチ数列の計算が書かれています。ドキュメント)準備として、ログ出力メソッドを定義しておきます。args));}今回は使用していませんが、forkされたタスクをトレースするためにスレッド名を表示できるようになっています。(2015-03-06の追記のついでにsimplifyしました。)それでは、APIドキュメントとほぼ同じバージョンを実行してみます。1の計算は、forkしたスレッドで処理してそれを待ち合わせ、その合計を返します。102334155fib(0)~fib(40)までを計算すると、38秒*1ほどかかりました。毎回計算するので当然ですね。コンストラクターが呼ばれた回数は866,988,831回でした。オーバーフローします。これを、キャッシュとBigIntegerに対応してみましょう。Fibonacci(BigInteger.valueOf(i))));HashMap#computeIfAbsentを使って、値が存在しないときだけ計算を実行するようにしています。並列処理だからといってConcurrentHashMapを使ってしまうと、途中から計算した場合に枝が増え過ぎてデッドロックが発生してしまいます。よって、ここでは通常のHashMapを使用します。追記(2015-03-06)@yohhoyさんからツイートいただきました。上の例と同じように、FibonacciのキャッシュをConcurrentHashMapを使って実装した場合の問題に関連して、興味深い情報が記載されています。ありがとうございました。overflowになったという冗談みたいな落ちが。(追記ここまで)それでは、一気にfib(500)あたりを数件実行してみます。3.16GHzで実行。(Java)Firefoxの履歴を書き出すツールをJavaで書いてみました。2016-02-26Javaでゲームパッドの入力をJInputを使って実現する突然、ゲームを作ってみたくなりました。以前、このような記事を書きました。処理系の実装これまでの実験のまとめとして、最後に処理系を作ってみました。(2)プロフィールid:argiusはてなブログをはじめよう!argiusさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。