diff options
author | Sibi Prabakaran <sibi@psibi.in> | 2020-06-05 16:55:52 +0530 |
---|---|---|
committer | Sibi Prabakaran <sibi@psibi.in> | 2020-06-05 16:55:52 +0530 |
commit | 878db39080607ba476ba8d8f547ad28259efb6a9 (patch) | |
tree | 2458ce512885d6ca527e14e9c8751458e4afe320 /src/Xmobar | |
parent | b15bb7c20b11a9f148c4757caba7167ee66492fc (diff) | |
download | xmobar-878db39080607ba476ba8d8f547ad28259efb6a9.tar.gz xmobar-878db39080607ba476ba8d8f547ad28259efb6a9.tar.bz2 |
Optimize date plugin
We avoid calling getTimeZone for each of the time the date has to be
updated. Instead, it's computed once at the start and re-used for each
invocation.
Looking at the implementation of 'getTimeZone', we can see that it's
very expensive:
https://www.stackage.org/haddock/lts-15.15/time-1.9.3/src/Data-Time-LocalTime-Internal-TimeZone.html#getTimeZone
It calls a C FFI each time to get the time
zone (getTimeZoneCTime). This is something which we can avoid and the
MR implements that.
I have been using my xmobar with this patch and the result has been
quite good. My xmobar CPU usage has used to hit 3~7%
intermittently. With this MR, It hits only 0.7% intermittently which
is nice. :-)
Diffstat (limited to 'src/Xmobar')
-rw-r--r-- | src/Xmobar/Plugins/Date.hs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/Xmobar/Plugins/Date.hs b/src/Xmobar/Plugins/Date.hs index 1cb0596..83ca1c9 100644 --- a/src/Xmobar/Plugins/Date.hs +++ b/src/Xmobar/Plugins/Date.hs @@ -31,8 +31,16 @@ data Date = Date String String Int instance Exec Date where alias (Date _ a _) = a - run (Date f _ _) = date f rate (Date _ _ r) = r + start (Date f _ r) cb = do + t <- getCurrentTime + zone <- getTimeZone t + go zone + where + go zone = doEveryTenthSeconds r $ date zone f >>= cb -date :: String -> IO String -date format = fmap (formatTime defaultTimeLocale format) getZonedTime +date :: TimeZone -> String -> IO String +date timezone format = do + time <- getCurrentTime + let zonedTime = utcToZonedTime timezone time + pure $ formatTime defaultTimeLocale format zonedTime |