Effective Scalaが公開されて数日経ちました。 Scalaはハイブリッド言語と言われるだけあって、命令型、関数型のスタイル両方共で書けるという素晴らしさを持っています。 Scalaにはバイブルともいうべき本がいくつか出ています。その中の一つが↓。 Scalaスケーラブルプログラミング第2版 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘出版社/メーカー: インプレスジャパン発売日: 2011/09/27メディア: 単行本(ソフトカバー)購入: 4人 クリック: 109回この商品を含むブログ (28件) を見る コレを読むとScalaで実施するためのmustな記法は知ることができます。ただ、こうするべき(should)というようなノウハウめいた記法は分かりません。 Effective Scalaを読むとTwitt
JVM における性能 JVM における性能モデルは論評こそは色々あるが、それに巻き込まれて結局よく理解されてないと言える。 様々な理由から、あるコードは期待されているよりも性能が悪かったり、スケーラブルではなかったりする。 以下にいくつかの理由をみていく。 一つは JVM 上のアプリケーションのコンパイル工程が静的にコンパイルされた言語のそれとは同じではないということが挙げられる([ 2 ] 参照)。 Java と Scala のコンパイラはソースコードを JVM バイトコードに変換するだけで、最適化はほとんど行わない。 現代的な JVM の多くではプログラムのバイトコードが実行されると、それは実行しているマシンのコンピュータアーキテクチャのマシンコードに変換する。 これはジャストインタイムコンパイラ (just-in-time compiler、JITコンパイラ) と呼ばれる。 しかし、
以前、マイクロベンチマークツールであるJMHを試してみたというエントリを書きました。 JMH http://openjdk.java.net/projects/code-tools/jmh/ マイクロベンチマークツール、JMHを試す http://d.hatena.ne.jp/Kazuhira/20140102/1388662362 で、その後Scalaで書こうとして、APTがあるのでJavaのブリッジコードが必要だというエントリを書きました。 Scala+sbtと、JMHを合わせて使う http://d.hatena.ne.jp/Kazuhira/20140102/1388671010 これに対して、最近@xuwei_kさんからsbtのJMHプラグインができたとツッコミをいただいたので、試してみることにしました。 sbt-jmh プラグインの名前は、「sbt-jmh」です。 sbt-jm
"新しい" とは、今まで全部無名classにコンパイルしてたラムダを、invoke dynamic使って動的に生成するようになるとかそういうやつ。 ラムダ以外の最適化もやってるようですが?詳しくは知りません。 Scala 2.12から正式に入るらしいですが、(これ書いてる時点から見て)つい昨日くらい(2015/06/25)に出たScala2.11.7でも、明示的にオプションを指定すれば、実験的オプションとしてですが、使えるそうです。 内部の仕組みは、以下のScaladays2015のスライド見るとか、あとは各自ググってください http://downloads.typesafe.com/website/presentations/ScalaDaysSF2015/T2_Rytz_Backend_Optimizer.pdf 公式に書いてありますが、2.11.7においてJava8のバックエンドを
[まとめ] LL脳がscalaの勉強を始めたよ LL脳がscalaの勉強を始めたよ その34 Scalaコップ本の11章残りをやってしまいますよー、今回はプリミティブ型なんかについてデス 11章は全体的に座学的な内容なのでほぼ写経…(´・ω・`)…まあ頑張ろうかしらね プリミティブ型の実装方法 Scalaでの整数演算はJVMとの互換性の点からプリミティブ型の演算として定義されているようデス ただし、整数をオブジェクトとして扱う必要ができた場合はjava.lang.Integerというバックアップクラスを使うらしいデスね。ちなみに整数をオブジェクトとして扱うのはtoStringメソッドの呼び出しやAny型の変数に整数を代入したりする場合とのことです。 このようにInt型の整数はjava.lang.Integerに透過的に変換されるらしく、この場合のjava.lang.Integerを「ボクシ
どうでもいい細かいパフォーマンスの話。とあるライブラリ作って遊んでる影響で、最近boxingや細かいパフォーマンスについて色々調べてるので、ついでに書いておく。 以前から、これちょっとだけ気になってたけど、ちゃんと計測してみたら一応差がでる。 つまり val intList: List[Int] = // 大きなIntのList intList.map(identity) よりも val intList: List[Int] = // 大きなIntのList intList.map(x => x) のほうが、速くなる(可能性がある)という話です。もちろん、最適化によって差がでないこともあるし、差が出るとしてもせいぜい数%から数十%程度でしょう。 scala -Xprint:jvm -e "List(0).map(identity)"や scala -Xprint:jvm -e "List(
列挙順自体はとくに意味ありません。あと「どの最適化がどのくらい速くなるのか?」を詳細に計ったことはないですし、「原理的にこうなってるから(ry」というのを説明するに過ぎません。中には「JITで無意味になるようなどうでもいい細かすぎること」も書いてありますし、最適化のトレードオフとして失うものもあるので、そのあたり自己責任でお願いします。本当に最適化が必要とされる場合は、以下のものを無闇に実行するよりまず計測したほうがいいのは、言うまでもありません。*1 1. private[this]をつかえ scalaのvalやvarは、private[this]にしたときのみ、直接のフィールドアクセスになります(それ以外ではメソッド呼び出し)。シングルトンのobjectの場合も同様です。private[this]をつけられる場合はできるだけつけましょう 2. なんでもかんでもListをつかうな 最初の
原文(投稿日:2011/11/30)へのリンク Yammerの従業員であるCoda Hale氏がScalaの商用ベンダであるTypesafe社へ送ったメールがYCombinatorとGitHubのgist経由でリークした。メールによれば、Yammerは複雑さや性能面を鑑みて、基盤のインフラをScalaからJavaへ戻すそうだ。 YammerのPR部門のShelley Risk氏によればこのメールはCoda Hale氏の個人的な意見であり、Yammerの公式な見解ではないとのことだ。このリーク後、Coda Hale氏は自身の考えをhttp://codahale.com/the-rest-of-the-story/で表明している。氏はこのメールはDonald Fischer氏(Typesafe社のCEO)からのフィードバックの要請に答えたもので、移行を示唆するツイートを補足したものだと説明して
サイバーエージェントのインターネット広告事業を技術面から支える「アドテクスタジオ」では、関数型言語の一つであるScalaが積極的に活用されています。今回、スマートフォン特化型のリアルタイムターゲティング広告を実現するサービス「Dynalyst」(図1)を開発した韓翔元氏(写真1)、そしてスマートフォン向けアドプラットフォームである「AMoAdアドネットワーク」(図2)の開発と運用を担当する井上ゆり氏(写真2)に、Scalaの魅力を伺いました。 最新のアドテクを詰め込んだDynalystにScalaを採用 ――最初にScalaに興味を持ったきっかけを教えてください。 井上:サイバーエージェントに入社する前から関数型言語に興味があり、評価が必要になるまで実際の計算を行わない遅延評価のしくみなどに魅力を感じていました。その中でも特にScalaにはJVM上で実行できるといったメリットがあり
jstack というツールがある。このツールは、現在実行中の Java プロセスのスレッドの状態を取得出来るツールだ。 思ったように性能が出ない時やデッドロックっぽい現象が発生した際はこのツールを使ってスレッドの状態を取得、つまりスレッドダンプを得て、そこから解決の糸口を探す。 今回のサンプルコードは下記コード。 少し長いが、Thread1 と Thread2 クラスはほぼ同一だ。違うのは、リソースをロックする順序。Thread1 クラスは resource1, resource2 の順にロックするが、Thread2 クラスは resource2, resource1 の順にロックする。つまり、これら2つのクラスを同時に実行するとデッドロックを起こす。 public class DeadLockTest { public static Object resource1 = new Obje
タスクサポート 並列コレクションは、演算のスケジューリングに関してモジュール化されている。 全ての並列コレクションはタスクサポートというオブジェクトによりパラメータ化されており、これがタスクのスケジューリングとプロセッサへの負荷分散 (load balancing) を担当する。 タスクサポートは内部にスレッドプールの実装への参照を持っており、タスクをより小さいタスクにいつどのように分割するかを決定している。 この内部の振る舞いに関してより詳しく知りたい場合はこのテクノロジーレポートを参照してほしい [ 1 ]。 現行の並列コレクションにはいくつかのタスクサポートの実装がある。 JVM 1.6 以上でデフォルトで使われるのは、 ForkJoinTaskSupport で、これは内部でフォーク/ジョインプールを使う。 JVM 1.5 とその他のフォーク/ジョインプールをサポートしない JVM
Scalaの並行処理とアクター、並列コレクション:スケーラブルで関数型でオブジェクト指向なScala入門(10)(1/3 ページ) 前回のおさらいと今回の内容 前回の記事「Scalaの抽象型と暗黙の型変換/引数、パラメータ制約」では、「implicit」キーワードを使用した暗黙の型変換と暗黙のパラメータなどを紹介しました。 今回はScalaが標準で持っている並行処理用ライブラリと並列コレクションを紹介します。 第1回記事では、Scala標準のREPLとScala IDEで動作を確認してみました。今後本記事のサンプルコードは、どちらで確認しても問題はありませんが、対話的に実行でき、1文ごとにコードの結果が分かって便利なので、基本的にはREPLを用いて説明していきます。 Scala IDEを使用する場合、第1回記事の『Scala IDE for Eclipseで「Hello Scala!」』を
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く