問題タブ [criterion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 基準を使用してエラーを入力します
パッケージについて説明しているドキュメントといくつかの記事を読みましたが、Haskellは初めてで、あまり理解していませんでしたが、試してみました...。
以下は私がしたことです:
次のエラーが発生しました。
haskell - Criterionを使用してHaskellプログラムのパフォーマンスを測定するにはどうすればよいですか?
Criterionフレームワークを使用して単純なHaarDWTプログラムのパフォーマンスを測定しようとしています。(誤って遅いですが、別の質問に残しておきます)。残念ながら、Web上で適切なドキュメントを見つけることができません。私の2つの主な問題は
- あるベンチマークから別のベンチマークにデータを渡すにはどうすればよいですか?プログラムの各段階の時間を計りたいです。
- サンプリングはどのように機能し、以前の計算を再利用する遅延評価を回避しますか?
このソースは比較的簡素化されています。最初の関数getRandList
は、乱数のリストを生成します。haarStep
入力信号を差と合計に変換しhaarDWT
、前者を呼び出して合計を繰り返します。getRandList
遅延評価を介してに渡そうとしてhaarDWT
いますが、使用法が正しくないか、サポートされていない可能性があります。タイミングが意味をなさないようです。
-s 1
最後に、 ;で呼び出そうとするとエラーが発生します。多分これは単なる基準のバグです。
前もって感謝します!
optimization - Haskell ベンチマーク/非厳密な削減の nf/whnf の最適化
大規模なデータ セットを取得し、それにさまざまな操作を適用するように設計されたライブラリを最適化しようとしています。ライブラリが機能するようになったので、最適化したいと思います。
非厳密な評価により、GHC は操作を組み合わせて、whnf 削減を容易にするために引数が順序付けられるように、すべての関数が記述されたときにデータが 1 回だけ反復されるようになるという印象を受けています。(そして、各データムで実行される操作の数を減らす可能性があります)
これをテストするために、次のコードを書きました。
Criterion ライブラリを使用したベンチマークでは、次の結果が得られます。
リストが(* 6)によって一度だけ操作されるように、GHCは「ダブル」機能を最適化しますか?nf の結果は、そうでなければ「double」の平均計算時間が「single」の 2 倍になるため、これが当てはまることを示しています。
whnf バージョンの実行速度が非常に速い理由は何ですか? 実際には何も実行されていないと想定することしかできません (または削減の最初の反復のみ)
正しい用語を使用していますか?
haskell - Criterion でベンチマークする前に関数入力の評価を強制する
Criterionで関数をベンチマークする前に、関数の入力の評価を強制するにはどうすればよいですか? いくつかの関数のベンチマークを試みていますが、入力サンクを評価する時間を除外したいと考えています。問題のコードは、入力にボックス化されていないベクトルを使用しますが、これはIntベクトルに対してはディープシーケンスできません。以下のコード スニペットの例:
Criterion ベンチマークには、上記の関数をベンチマークするときのshortvおよびintv入力をビルドする時間が含まれます。基準測定値は以下のとおりです。入力のビルド時間も含まれているように見える各関数で約 400ns を測定します。
ここで、ベンチマーク コードのメイン セクションが次のように変更された場合 (2 番目のベンチ関数を削除することにより):
encodeInt16V関数がベンチマークされる前に shortv 入力が評価されるようです。このベンチマークは、入力を構築する時間を除いて、関数の実行時間を測定するため、これは私にとって実際に望ましい出力です。以下の基準出力:
同様に、"encode IntV" ベンチマークのみをベンチマークすると、そのベンチマークでも最大 150ns の時間が得られます。
Criterion のドキュメントから、より正確なベンチマークのために遅延評価を回避しようとしていることを知っています。それは理にかなっており、ここでは実際の問題ではありません。私の質問は、shortv と intv の入力を作成して、ベンチ関数に渡される前に評価されるようにする方法です。現時点では、defaultMain を制限して一度に 1 つの関数のみをベンチマークすることでこれを実現できますが (上記で示したように)、これは理想的なソリューションではありません。
編集1
ここで Criterion ベンチマークで何か他のことが起こっています。これは、リストではなくベクトル配列でのみ発生するようです。shortv と intv を出力して完全な評価を強制すると、ベンチマークはまだ 150ns ではなく 400ns の時間を測定します。以下のコードの更新:
基準出力 (また、正しくないように見える 158.4% の外れ値があります):
haskell - 基準ライブラリによって取得されたコマンドラインオプション
ライブラリの基準とcmdargsを使用しました。
cmdargsを使用せずにプログラムを完全にコンパイルして実行すると、たとえば./prog --helpとすると、可能なオプションや実行回数などに関する基準から、不要な応答が返されます。
以下のようにコンパイルして実行すると、コマンドラインオプションが最初にコードによって選択され、次に基準によって読み取られます。その後、Criterionが報告し、オプション--byteが不明であることを示すエラーが発生します。基準のドキュメントでは、これをオフにする方法や回避する方法については何も見ていません。コマンドラインオプションを読んだ後でクリアする方法はありますか?それ以外の場合は、基準の代わりにCPUTimeなどを使用する必要があります。これは、基準が提供する追加の機能とデータの負荷を実際に必要とするため、問題ありません。
haskell - 基準の機能
ここで基準の使用の古い例をいくつか見つけました。2009 年には、グラフを描画するためのコマンド ライン オプションをサポートしていたようです。
ここで、基準 0.6 をインポートすると、(テストするために) 基本的なアプリケーションでラップし、./application --help と言うと、使用可能なオプションがほとんどなく、描画に関連するものは何もありません。出力形式と機能に関して、2009 年には 2012 年よりも多くの機能があったように思えますか?
基本的な html レポートを作成するhtml への基準があるようですが、上記の Web サイトまたは基準ソース パケットのサンプル ディレクトリに表示される png 出力などに近いものはありません。
正確で最新の情報はどこで入手できますか?
haskell - 基準からのHTML出力の生成
http://bos.github.com/criterion/に、基準からのHTML出力の良い例があります。
この出力を生成するために使用されるコマンドラインオプションはどれですか?
関連する質問への回答は、この出力が終了することを示していますが、を使用するとコマンドラインオプションに表示されないようです。--help
haskell - 一貫した基準ベンチマークを取得したり、実行全体で結果を解釈するにはどうすればよいですか?
INLINE
たとえば、関数にプラグマを追加した場合の効果を比較する基準を使用して、一部のコードを最適化しようとしています。しかし、再コンパイル/実行間で結果が一貫していないことがわかりました。
結果を比較できるように実行全体で一貫した結果を得る方法、またはベンチマークが信頼できるかどうかを評価する方法、つまり (推測) 分散に関する詳細を解釈する方法を知る必要があります。クロックコール」など
私の特定のケースの詳細
これは、上記の私の主な質問とは直交していますが、私の特定のケースでは、いくつかのことが矛盾を引き起こしている可能性があります。
この例で使用する方法が機能しなかったため、使用して
IO
アクションのベンチマークを試みています。whnfIO
whnf
私のコードは同時実行を使用しています
たくさんのタブとがらくたを開いてしまった
出力例
これらは両方とも、まったく同じ方法でコンパイルされた同じコードからのものです。すぐ下で最初の実行を行い、変更を加えて別のベンチマークを実行し、元に戻して最初のコードを再度実行し、次のようにコンパイルしました。
ファーストラン:
2 回目の実行、約 3 倍遅い:
「クロック呼び出しの推定コスト」でスケーリングすると、2 つのベンチマークがかなり近いことがわかります。比較のために実数を取得するために私がすべきことは何ですか?
haskell - Criterion ベンチマークのデータを作成する方法は?
Haskell コードのベンチマークに基準を使用しています。ランダムなデータが必要な重い計算を行っています。メインのベンチマーク ファイルを次のように記述しました。
それらのベンチマークとデータジェネレーターをさまざまなモジュールに保持しています。
これは機能しますが、2 つの懸念事項があります。まず、ランダム データの生成に必要な時間はベンチマークに含まれていますか? その件に関する質問を見つけましたが、正直なところ、それを自分のコードに適用することはできません。これが発生するかどうかを確認するために、IO モナド内に含まれる別のバージョンのデータ ジェネレーターを作成しました。ジェネレーターと呼ばれる main でベンチマーク リストを配置し、<- で結果を抽出してから、ベンチマーク関数に渡しました。パフォーマンスに違いは見られませんでした。
2 つ目の懸念事項は、ランダム データの生成に関するものです。現在、一度作成されたジェネレーターは更新されていないため、1 回の実行で同じデータが生成されます。これは大きな問題ではありませんが、それでも適切に作成するとよいでしょう。各 data* 関数内で異なるランダム データを生成する適切な方法はありますか? 「Neat」とは、「IO内でStdGenを取得するデータ関数を作成しない」ことを意味しますか?
編集:以下のコメントで述べたように、データのランダム性についてはあまり気にしません。私にとって重要なのは、データの生成に必要な時間がベンチマークに含まれていないことです。