Haskellで外部実行ファイルの実行時間を調べる。つづき
Haskellで外部実行ファイルの実行時間を調べる。 - 妄想宝箱の続き。
ふつうのHaskell届いたぜ。
ということで、前のやつのバージョンアップを。
やることは
- 2個以上の引数も対応する
- かっこよく時間を表示
- リファクタリング
の三つ。
2個以上の引数も対応する
前のコードの一部
main = do args <- getArgs wait $ head args
以前はhead関数を使ってたら、配列の最初しか取得できなかったけど、
「ふつうのHaskell」にunwordというStringの配列を結合する便利なのが紹介されてたのでそれを使用。
変更後。
main = do args <- getArgs wait $ unwords args
かっこよく時間を表示
以前はTimeDiffをそのままshowしてただけだから出力したデータが見にくかった。
で、改善するためにてきとーにshowTimeという関数を作った。
showTime :: TimeDiff -> String showTime (TimeDiff year month d h m s p) = showNonZero year "year " ++ showNonZero month "month " ++ showNonZero d "d " ++ showNonZero h "h " ++ show m ++ "m "++ show s ++ "s " ++ (show $ div p 1000000000) ++ "ms" showNonZero :: (Num a) => a -> String -> String showNonZero 0 _ = "" showNonZero x unit = show x ++ unit
なんか汚いコードだな・・・。dataの使い方がいまいちよく分からん。
配列の用に(x:xs)のようなパターンマッチ使えるとうまく書けそうだけど、dataにないの?
あと前のコメントでも言われていたが、ピコ秒単位での取得出来てないっぽいのでミリ秒単位に変更。
リファクタリング
…するとこねぇー!
たぶん、>>=とか使えばもっと短くなるかもしれんが、これ以上やるとわかり難くなりそう。
ということで完成品。
--引数に入れた外部ファイルの実行速度を測るぜ! module Main where import System import System.Process import Time main = do args <- getArgs start <- getClockTime wait $ unwords args end <- getClockTime putStrLn $ showTime $ diffClockTimes end start wait :: String -> IO ExitCode wait = (>>= waitForProcess) . runCommand showTime :: TimeDiff -> String showTime (TimeDiff year month d h m s p) = showNonZero year "year " ++ showNonZero month "month " ++ showNonZero d "d " ++ showNonZero h "h " ++ show m ++ "m "++ show s ++ "s " ++ (show $ div p 1000000000) ++ "ms" showNonZero :: (Num a) => a -> String -> String showNonZero 0 _ = "" showNonZero x unit = show x ++ unit
やっぱりshowTimeが長い。