[Haskell-cafe] How to optimize a directory scanning?
magicloud.magiclouds at gmail.com
Fri May 10 02:00:45 UTC 2019
I have asked this in Stackoverflow without getting an answer.
Wondering if people here could have some thoughts.
I have a function reading the content of /proc every second.
Surprisingly, its CPU usage in top is around 5%, peak at 8%. But same
logic in C or Rust just takes like 1% or 2%. Wondering if this can be
improved. /proc is virtual filesystem, so this is not related to HDD
performance. And I noticed this difference because my CPU is too old
(Core Gen2). On modern CPU, as tested by others, the difference is
import System.IO.Strict as Strict
watch u limit0s limit0h = do
listDirectory "/proc/" >>= mapM_ (\fp -> do
isMyPid' <- maybe False id <$> wrap2Maybe (isMyPid fp u)
wrap2Maybe (Strict.readFile ("/proc/" </> fp </> "stat")))
watch u limit0s limit0h
wrap2Maybe :: IO a -> IO (Maybe a)
wrap2Maybe f = catch ((<$>) Just $! f) (\(_ :: IOException) ->
isMyPid :: FilePath -> UserID -> IO Bool
isMyPid fp me = do
let areDigit = fp >= "0" && fp <= "9"
isDir <- doesDirectoryExist $ "/proc/" </> fp
owner <- fileOwner <$> getFileStatus ("/proc" </> fp)
return $ areDigit && isDir && (owner == me)
More information about the Haskell-Cafe