From 17b0dac481c01425651326e8814b45058cd40f06 Mon Sep 17 00:00:00 2001 From: Tomas Janousek Date: Thu, 12 Nov 2020 10:02:44 +0000 Subject: Optimize Date plugin again (refresh timezone only once a minute) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the Date plugin approximately twice as fast, and makes xmobar up to about 5–10 % faster if Date is the only active plugin. (If more expensive plugins like Network or MultiCpu are used, it doesn't make any measurable difference.) Micro-benchmark results on my HW: Date Benchmarks/Date mean 2.833 μs ( +- 16.08 ns ) Date Benchmarks/DateZonedTime mean 5.020 μs ( +- 32.91 ns ) Date Benchmarks/DateWithTimeZone mean 2.827 μs ( +- 20.52 ns ) (DateZonedTime is the original implementation and DateWithTimeZone is the implementation we had since 0.34 which never refreshes timezone.) Real-life measurements (done overnight on an idle laptop, with all measured xmobars running in parallel to ensure comparable conditions; xmobars configured to only display date and with rate 10 — once per second): $ time timeout 6h xmobar .xmobarrc-DateZonedTime real 360m0,010s user 0m9,867s sys 0m4,644s (9.867 + 4.644) / (360 * 60) = 0.000672 $ time timeout 6h xmobar .xmobarrc-Date real 360m0,008s user 0m9,535s sys 0m4,327s (9.535 + 4.327) / (360 * 60) = 0.000642 $ time timeout 6h xmobar .xmobarrc-Date-10m real 360m0,010s user 0m9,780s sys 0m4,215s (9.780 + 4.215) / (360 * 60) = 0.000648 $ time timeout 6h xmobar .xmobarrc-DateWithTimeZone real 360m0,006s user 0m9,658s sys 0m4,166s (9.658 + 4.166) / (360 * 60) = 0.000640 (.xmobarrc-Date-10m is the proposed implementation, but with timezone refresh every 10 minutes instead of every 1 minute) Interpretation of these results: * refreshing xmobar with just date takes around 650 μs * that is xmobar with just date uses around 0.065 % of CPU time * refreshing timezone takes additional cca 30 μs When we only refresh timezone once a minute, these 30 μs become 0.5 μs amortized, and that should be acceptable to even the most dedicated perfectionist :-) Fixes: a58e32f7c8af ("Revert "Optimize date plugin"") Fixes: 878db3908060 ("Optimize date plugin") Co-authored-by: Sibi Prabakaran --- bench/main.hs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'bench') diff --git a/bench/main.hs b/bench/main.hs index f8db78c..10639eb 100644 --- a/bench/main.hs +++ b/bench/main.hs @@ -1,12 +1,14 @@ module Main (main) where +import Data.IORef (newIORef) +import Data.Time import Gauge import Xmobar import Xmobar.Plugins.Monitors.Cpu main :: IO () main = do - defaultMain =<< sequence [cpuBench] + defaultMain =<< sequence [cpuBench, dateBench] mkCpuArgs :: IO CpuArguments mkCpuArgs = getArguments ["-L", "3", "-H", "50", "--normal", "green", "--high", "red", "-t", "Cpu: %"] @@ -17,3 +19,21 @@ cpuBench = do return $ bgroup "Cpu Benchmarks" [ bench "CPU normal args" $ nfIO (runCpu cpuArgs) ] + +dateBench :: IO Benchmark +dateBench = do + let format = "D: %B %d %A W%V" + zone <- getCurrentTimeZone + zone' <- newIORef =<< getCurrentTimeZone + return $ bgroup "Date Benchmarks" + [ bench "Date" $ nfIO (date zone' format) + , bench "DateZonedTime" $ nfIO (dateZonedTime format) + , bench "DateWithTimeZone" $ nfIO (dateWithTimeZone zone format) + ] + +dateZonedTime :: String -> IO String +dateZonedTime format = fmap (formatTime defaultTimeLocale format) getZonedTime + +dateWithTimeZone :: TimeZone -> String -> IO String +dateWithTimeZone zone format = + fmap (formatTime defaultTimeLocale format . utcToZonedTime zone) getCurrentTime -- cgit v1.2.3