summaryrefslogtreecommitdiff
path: root/libraries/base/tests/perf/encodingAllocations.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/tests/perf/encodingAllocations.hs')
-rwxr-xr-xlibraries/base/tests/perf/encodingAllocations.hs30
1 files changed, 30 insertions, 0 deletions
diff --git a/libraries/base/tests/perf/encodingAllocations.hs b/libraries/base/tests/perf/encodingAllocations.hs
new file mode 100755
index 0000000000..cd136963cb
--- /dev/null
+++ b/libraries/base/tests/perf/encodingAllocations.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -dno-typeable-binds -O2 #-}
+
+module Main (main) where
+
+import System.IO
+import Data.Bits
+import GHC.Int
+import GHC.Exts
+import System.Environment
+import Distribution.Simple.Utils
+
+
+main :: IO ()
+main = withTempFile "." "encodingAllocations.tmp" (const $ loop 1000000)
+
+loop :: Int -> Handle -> IO ()
+loop 0 !_ = pure ()
+loop !n !h = do
+ hPutChar h $! dummy_char n
+ loop (n-1) h
+
+-- unsafe efficient version of `chr`
+my_chr :: Int -> Char
+my_chr (I# i) = C# (chr# i)
+
+-- return either a or b
+dummy_char :: Int -> Char
+dummy_char !i = my_chr ((i .&. 1) + 97)