2011-12-08 7 views
7

私はライブラリの基準とcmdargsを使用しました。基準ライブラリで選択されたコマンドラインオプション

私はcmdargsを使わずにプログラムを完全にコンパイルして実行します。 ./prog --help次に、実行可能なオプションと実行回数などの嫌な応答を受け取ります。

以下のようにコンパイルして実行すると、コマンドラインオプションはまず自分のコードで取得されます基準で読む。その後、Criteriaは、オプション--byteが不明であることを報告し、エラーを出します。私は、これがどのようにスイッチオフされるか、または回避されるかについて、基準文書では何も見ていない。私はそれらを読んだことのコマンドラインオプションをクリアする方法はありますか?それ以外の場合は、基準の代わりにCPUTimeを使用しています。これは、基準が提供する余分な機能とデータの負荷を本当に必要とするため、私にとっては大丈夫です。

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE DeriveDataTypeable #-} 

import System.Console.CmdArgs 

data Strlen = Strlen {byte :: Int} deriving (Data, Typeable, Show) 

strlen = cmdArgsMode $ Strlen {byte = def} &= summary "MessagePack benchmark v0.04" 

main = do 
    n <- cmdArgsRun strlen 
    let datastring = take (byte n) $ randomRs ('a','z') (mkStdGen 3) 
    putStrLn "Starting..." 
    conn <- connect "192.168.35.62" 8081 
    defaultMain [bench "sendReceive" $ whnfIO (mywl conn datastring)] 

答えて

11

System.Environment.withArgsを使用してください。あなたはcriterionに使用していないものを渡し、その後、cmdArgsで最初のコマンドライン引数を解析します。

main = do 
    (flags, remaining) <- parseArgsHowever 
    act according to flags 
    withArgs remaining $ 
     defaultMain [ ... ] 
+0

これは私のコードスニペットにどのように適用するのか分かりません。 –

+0

@JFritschさて、私はcmdargsドキュメントを見てきました。私が理解していれば、あなたのタイプ( 'Strlen')に他の引数のフィールドを追加し、' args'でそれらを収集しなければなりません。しかし、私はcmdargsが未知のオプションで何をしているのかよくわかりません。基準をデフォルトの設定だけにしたい場合、 'withArgs [] $ defaultMain ...'は単純で動作します。固定argsを基準に渡す場合は、 'withArgs [" -s "、" 200 "]'など。 –

+0

System.Environment(withArgs)をインポートしてももちろん動作します。結果として得られるバイナリ・リーンを維持するよりエレガントなものがあるのだろうかと思います。 –

3

criterion sourceを見てみましょう。あなたはそれらを無視するか、または未知のargsなどを無視するなど、あなたが望むようにargsを処理する独自のdefaultMainWith関数を書くことができるはずです...

関連する問題