2012-07-31 12 views
8

対したがって、デバッグロギングをオフにしても、そのステートメントは実行されません。しかし、私はちょうど、特にスカラ座のロギングライブラリの多くは、Logulaを使用していないとは異なりパフォーマンスは値による呼び出し、私は最近、様々なScalaのログ図書館で見てきたし、それらの大半は</p> <pre><code>def debug(s: => String) </code></pre> <p>としてのログ機能を実装による呼び出し名

その利点の一つとして述べてlogulaに出くわした 渡しの名前の意味(例えば、F:=> A)そのログ・ステートメントについて、 二つのことを意味している:Scalaのコンパイラは、各ログ文の一回限りの閉鎖オブジェクトを作成する必要はありません

  • を。これはゴミの量を減らすはずです 収集圧力。

これは実際に私には分かりやすいものです。だから私の質問は、2つのアプローチを比較する実績のベンチマーク/データはありますか?理想的には、ライブプロジェクトのものと、工学的なベンチマークとの比較

答えて

8

どちらが高速かは、使用状況によって異なります。静的な文字列をロギングする場合は、その定数文字列を渡して無視する方が速いです。それ以外の場合は、文字列を作成する場合は、とにかく少なくとも1つのオブジェクトを作成する必要があります。関数オブジェクトは小さく、安価です - あなたはそれを無視するつもりならば、文字列よりもそれらのうちの1つを作成する方が良いです。

個人的には、このような第1原理のトレードオフの理解は、どちらかを選択した理由を理解できるように、特定のアプリケーションを使用した特定のアプリケーションのケーススタディよりも重要です。もう一方(そして、あなたは常に自分のアプリケーションをベンチマークしたいと思うでしょう)。

(注:どのように高価なオブジェクトの作成であると、ガベージコレクタがどのように重く影響に依存し、一般に、短命のオブジェクトは、毎秒10 のオーダーのレートで作成され、廃棄されることができますあなたがタイトな内部ループにロギングステートメントを入れているなら、何か間違っていると思うので、代わりにユニットテストを書いてください)

+1

「個人的には、このような第一原理のトレードオフの理解は、特定のアプリケーションの事例研究よりも価値がある」と私は確信しているが、現実はあなたとは全く違う獣予期する。ベンチマークではなく実際のケースを探しているのは、誰でもベンチマークを書くことができるため、一方通行が100万倍も速く見えるからです。私自身の好奇心のために、正に、どのアプリケーションが本当にボトルネックを記録しているのか? – Falmarri

+0

@Falmarri - 例から推測すると、あなたが期待するものとは異なる場合があります。だから私は基本的なトレードオフについて説明した。私はロギングがほとんどのアプリケーションでボトルネックにならないはずだと同意します。 –

+0

@Falmarriまあ...あなたはすべてを測定しますか?キューのサイズ、スループット、応答時間など、アプリケーションのあらゆるステップを測定して誓う人がいます。あなたがそのルートに行くなら、総時間にあなたのロギングを追加したくないです。実際には、非同期であることを望みます。 –

3

私は外出しますトレードオフについての哲学的議論は、いくつかの興味深いトレードオフが存在する場合、すなわちここではない場合に、より有用であると述べている。

class A { 
    var debugging = true 
    @inline final def debug(msg: => String) = if (debugging) println(msg) 

    def f = { debug("I'm debugging!") ; 5 } 
} 
% scalac292 -optimise a.scala 
% ls -l *.class 
-rw-r--r-- 1 paulp staff 1503 Jul 31 22:40 A.class 
% 

クロージャオブジェクトをカウントします。

+1

非常に知っておいてよかった!ロギングを行うために外部ライブラリのログメソッドを使用しようとしている場合、elisionを達成するのはもっと難しいかもしれませんが、これはライブラリ呼び出しをラップする独自のローカルの@inline final def debugを持つべきだと主張していますそれらの場所であなたがそれを必要とする。 –

関連する問題

 関連する問題