Bryan O'Sullivan avatar Bryan O'Sullivan committed 8d97de2

Initial cut at cross-language benchmarks

Comments (0)

Files changed (4)

benchmarks/haskell/Multilang.hs

+{-# LANGUAGE BangPatterns, OverloadedStrings, RankNTypes #-}
+
+module Main (
+  main
+  ) where
+
+import Control.Monad (forM_)
+import qualified Data.ByteString as B
+import qualified Data.Text as Text
+import Data.Text.Encoding (decodeUtf8)
+import Data.Text (Text)
+import System.IO (hFlush, stdout)
+import Timer (timer)
+
+type BM = Text -> ()
+
+bm :: forall a. (Text -> a) -> BM
+bm f t = f t `seq` ()
+
+benchmarks :: [(String, Text.Text -> ())]
+benchmarks = [
+    ("find_first", bm $ Text.isInfixOf "en:Benin")
+  , ("find_index", bm $ Text.findIndex (=='c'))
+  ]
+
+main :: IO ()
+main = do
+  !contents <- decodeUtf8 `fmap` B.readFile "../tests/text-test-data/yiwiki.xml"
+  forM_ benchmarks $ \(name, bmark) -> do
+    putStr $ name ++ " "
+    hFlush stdout
+    putStrLn =<< (timer 100 contents bmark)

benchmarks/haskell/Timer.hs

+{-# LANGUAGE BangPatterns #-}
+
+module Timer (timer) where
+
+import Control.Exception (evaluate)
+import Data.Time.Clock.POSIX (getPOSIXTime)
+import GHC.Float (FFFormat(..), formatRealFloat)
+
+ickyRound :: Int -> Double -> String
+ickyRound k = formatRealFloat FFFixed (Just k)
+
+timer :: Int -> a -> (a -> b) -> IO String
+timer count a0 f = do
+  let loop !k !fastest
+        | k <= 0 = return fastest
+        | otherwise = do
+        start <- getPOSIXTime
+        let inner a i
+              | i <= 0    = return ()
+              | otherwise = evaluate (f a) >> inner a (i-1)
+        inner a0 count
+        end <- getPOSIXTime
+        let elapsed = end - start
+        loop (k-1) (min fastest (elapsed / fromIntegral count))
+  t <- loop (3::Int) 1e300
+  let log10 x = log x / log 10
+      ft = realToFrac t
+      prec = round (log10 (fromIntegral count) - log10 ft)
+  return $! ickyRound prec ft
+{-# NOINLINE timer #-}

benchmarks/python/multilang.py

+#!/usr/bin/env python
+
+import math
+import sys
+import time
+
+def find_first():
+    cf = contents.find
+    return timer(lambda: cf("en:Benin"))
+
+def timer(f, count=100):
+    a = 1e300
+    def g():
+        return
+    for i in xrange(3):
+        start = time.time()
+        for j in xrange(count):
+            g()
+        a = min(a, (time.time() - start) / count)
+
+    b = 1e300
+    for i in xrange(3):
+        start = time.time()
+        for j in xrange(count):
+            f()
+        b = min(b, (time.time() - start) / count)
+
+    return round(b - a, int(round(math.log(count, 10) - math.log(b - a, 10))))
+
+contents = open('../../tests/text-test-data/yiwiki.xml', 'r').read()
+contents = contents.decode('utf-8')
+
+benchmarks = (
+    find_first,
+    )
+
+to_run = sys.argv[1:]
+bms = []
+if to_run:
+    for r in to_run:
+        for b in benchmarks:
+            if b.__name__.startswith(r):
+                bms.append(b)
+else:
+    bms = benchmarks
+
+for b in bms:
+    sys.stdout.write(b.__name__ + ' ')
+    sys.stdout.flush()
+    print b()

benchmarks/text-benchmarks.cabal

                   ghc-prim,
                   stringsearch,
                   utf8-string
+
+executable text-multilang
+  hs-source-dirs: haskell
+  main-is:        Multilang.hs
+  ghc-options:    -Wall -O2
+  build-depends:  base == 4.*,
+                  bytestring,
+                  text,
+                  time
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.