Commits

Bryan O'Sullivan committed 871303f

Benchmark the various checked multiplication methods

Progress towards gh-81.

Comments (0)

Files changed (3)

benchmarks/haskell/Benchmarks.hs

 import qualified Benchmarks.Equality as Equality
 import qualified Benchmarks.FileRead as FileRead
 import qualified Benchmarks.FoldLines as FoldLines
+import qualified Benchmarks.Mul as Mul
 import qualified Benchmarks.Pure as Pure
 import qualified Benchmarks.ReadNumbers as ReadNumbers
 import qualified Benchmarks.Replace as Replace
         , Equality.benchmark (tf "japanese.txt")
         , FileRead.benchmark (tf "russian.txt")
         , FoldLines.benchmark (tf "russian.txt")
+        , Mul.benchmark
         , Pure.benchmark "tiny" (tf "tiny.txt")
         , Pure.benchmark "ascii" (tf "ascii-small.txt")
         , Pure.benchmark "france" (tf "france.html")

benchmarks/haskell/Benchmarks/Mul.hs

+module Benchmarks.Mul (benchmark) where
+
+import Control.Exception (evaluate)
+import Criterion.Main
+import Data.Int (Int32, Int64)
+import Data.Text.Internal (mul32, mul64)
+import qualified Data.Vector.Unboxed as U
+
+oldMul :: Int64 -> Int64 -> Int64
+oldMul m n
+    | n == 0                 = 0
+    | m <= maxBound `quot` n = m * n
+    | otherwise              = error "overflow"
+
+benchmark :: IO Benchmark
+benchmark = do
+  _ <- evaluate testVector32
+  _ <- evaluate testVector64
+  return $ bgroup "Mul" [
+      bench "oldMul" $ whnf (U.map (uncurry oldMul)) testVector64
+    , bench "mul64" $ whnf (U.map (uncurry mul64)) testVector64
+    , bench "*64" $ whnf (U.map (uncurry (*))) testVector64
+    , bench "mul32" $ whnf (U.map (uncurry mul32)) testVector32
+    , bench "*32" $ whnf (U.map (uncurry (*))) testVector32
+    ]
+
+testVector64 :: U.Vector (Int64,Int64)
+testVector64 = U.fromList [
+  (0,1248868987182846646),(169004623633872,24458),(482549039517835,7614),
+  (372,8157063115504364),(27,107095594861148252),(3,63249878517962420),
+  (4363,255694473572912),(86678474,1732634806),(1572453024,1800489338),
+  (9384523143,77053781),(49024709555,75095046),(7,43457620410239131),
+  (8,8201563008844571),(387719037,1520696708),(189869238220197,1423),
+  (46788016849611,23063),(503077742109974359,0),(104,1502010908706487),
+  (30478140346,207525518),(80961140129236192,14),(4283,368012829143675),
+  (1028719181728108146,6),(318904,5874863049591),(56724427166898,110794),
+  (234539368,31369110449),(2,251729663598178612),(103291548194451219,5),
+  (76013,5345328755566),(1769631,2980846129318),(40898,60598477385754),
+  (0,98931348893227155),(573555872156917492,3),(318821187115,4476566),
+  (11152874213584,243582),(40274276,16636653248),(127,4249988676030597),
+  (103543712111871836,5),(71,16954462148248238),(3963027173504,216570),
+  (13000,503523808916753),(17038308,20018685905),(0,510350226577891549),
+  (175898,3875698895405),(425299191292676,5651),(17223451323664536,50),
+  (61755131,14247665326),(0,1018195131697569303),(36433751497238985,20),
+  (3473607861601050,1837),(1392342328,1733971838),(225770297367,3249655),
+  (14,127545244155254102),(1751488975299136,2634),(3949208,504190668767),
+  (153329,831454434345),(1066212122928663658,2),(351224,2663633539556),
+  (344565,53388869217),(35825609350446863,54),(276011553660081475,10),
+  (1969754174790470349,3),(35,68088438338633),(506710,3247689556438),
+  (11099382291,327739909),(105787303549,32824363),(210366111,14759049409),
+  (688893241579,3102676),(8490,70047474429581),(152085,29923000251880),
+  (5046974599257095,400),(4183167795,263434071),(10089728,502781960687),
+  (44831977765,4725378),(91,8978094664238578),(30990165721,44053350),
+  (1772377,149651820860),(243420621763408572,4),(32,5790357453815138),
+  (27980806337993771,5),(47696295759774,20848),(1745874142313778,1098),
+  (46869334770121,1203),(886995283,1564424789),(40679396544,76002479),
+  (1,672849481568486995),(337656187205,3157069),(816980552858963,6003),
+  (2271434085804831543,1),(0,1934521023868747186),(6266220038281,15825),
+  (4160,107115946987394),(524,246808621791561),(0,1952519482439636339),
+  (128,2865935904539691),(1044,3211982069426297),(16000511542473,88922),
+  (1253596745404082,2226),(27041,56836278958002),(23201,49247489754471),
+  (175906590497,21252392),(185163584757182295,24),(34742225226802197,150),
+  (2363228,250824838408),(216327527109550,45),(24,81574076994520675),
+  (28559899906542,15356),(10890139774837133,511),(2293,707179303654492),
+  (2749366833,40703233),(0,4498229704622845986),(439,4962056468281937),
+  (662,1453820621089921),(16336770612459631,220),(24282989393,74239137),
+  (2724564648490195,3),(743672760,124992589),(4528103,704330948891),
+  (6050483122491561,250),(13322953,13594265152),(181794,22268101450214),
+  (25957941712,75384092),(43352,7322262295009),(32838,52609059549923),
+  (33003585202001564,2),(103019,68430142267402),(129918230800,8742978),
+  (0,2114347379589080688),(2548,905723041545274),(222745067962838382,0),
+  (1671683850790425181,1),(455,4836932776795684),(794227702827214,6620),
+  (212534135175874,1365),(96432431858,29784975),(466626763743380,3484),
+  (29793949,53041519613),(8359,309952753409844),(3908960585331901,26),
+  (45185288970365760,114),(10131829775,68110174),(58039242399640479,83),
+  (628092278238719399,6),(1,196469106875361889),(302336625,16347502444),
+  (148,3748088684181047),(1,1649096568849015456),(1019866864,2349753026),
+  (8211344830,569363306),(65647579546873,34753),(2340190,1692053129069),
+  (64263301,30758930355),(48681618072372209,110),(7074794736,47640197),
+  (249634721521,7991792),(1162917363807215,232),(7446433349,420634045),
+  (63398619383,60709817),(51359004508011,14200),(131788797028647,7072),
+  (52079887791430043,7),(7,136277667582599838),(28582879735696,50327),
+  (1404582800566278,833),(469164435,15017166943),(99567079957578263,49),
+  (1015285971,3625801566),(321504843,4104079293),(5196954,464515406632),
+  (114246832260876,7468),(8149664437,487119673),(12265299,378168974869),
+  (37711995764,30766513),(3971137243,710996152),(483120070302,603162),
+  (103009942,61645547145),(8476344625340,6987),(547948761229739,1446),
+  (42234,18624767306301),(13486714173011,58948),(4,198309153268019840),
+  (9913176974,325539248),(28246225540203,116822),(2882463945582154,18),
+  (959,25504987505398),(3,1504372236378217710),(13505229956793,374987),
+  (751661959,457611342),(27375926,36219151769),(482168869,5301952074),
+  (1,1577425863241520640),(714116235611821,1164),(904492524250310488,0),
+  (5983514941763398,68),(10759472423,23540686),(72539568471529,34919),
+  (4,176090672310337473),(938702842110356453,1),(673652445,3335287382),
+  (3111998893666122,917),(1568013,3168419765469)]
+
+testVector32 :: U.Vector (Int32,Int32)
+testVector32 = U.fromList [
+  (39242,410),(0,100077553),(2206,9538),(509400240,1),(38048,6368),
+  (1789,651480),(2399,157032),(701,170017),(5241456,14),(11212,70449),
+  (1,227804876),(749687254,1),(74559,2954),(1158,147957),(410604456,1),
+  (170851,1561),(92643422,1),(6192,180509),(7,24202210),(3440,241481),
+  (5753677,5),(294327,1622),(252,4454673),(127684121,11),(28315800,30),
+  (340370905,0),(1,667887987),(592782090,1),(49023,27641),(750,290387),
+  (72886,3847),(0,301047933),(3050276,473),(1,788366142),(59457,15813),
+  (637726933,1),(1135,344317),(853616,264),(696816,493),(7038,12046),
+  (125219574,4),(803694088,1),(107081726,1),(39294,21699),(16361,38191),
+  (132561123,12),(1760,23499),(847543,484),(175687349,1),(2963,252678),
+  (6248,224553),(27596,4606),(5422922,121),(1542,485890),(131,583035),
+  (59096,4925),(3637115,132),(0,947225435),(86854,6794),(2984745,339),
+  (760129569,1),(1,68260595),(380835652,2),(430575,2579),(54514,7211),
+  (15550606,3),(9,27367402),(3007053,207),(7060988,60),(28560,27130),
+  (1355,21087),(10880,53059),(14563646,4),(461886361,1),(2,169260724),
+  (241454126,2),(406797,1),(61631630,16),(44473,5943),(63869104,12),
+  (950300,1528),(2113,62333),(120817,9358),(100261456,1),(426764723,1),
+  (119,12723684),(3,53358711),(4448071,18),(1,230278091),(238,232102),
+  (8,57316440),(42437979,10),(6769,19555),(48590,22006),(11500585,79),
+  (2808,97638),(42,26952545),(11,32104194),(23954638,1),(785427272,0),
+  (513,81379),(31333960,37),(897772,1009),(4,25679692),(103027993,12),
+  (104972702,11),(546,443401),(7,65137092),(88574269,3),(872139069,0),
+  (2,97417121),(378802603,0),(141071401,4),(22613,10575),(2191743,118),
+  (470,116119),(7062,38166),(231056,1847),(43901963,9),(2400,70640),
+  (63553,1555),(34,11249573),(815174,1820),(997894011,0),(98881794,2),
+  (5448,43132),(27956,9),(904926,1357),(112608626,3),(124,613021),
+  (282086,1966),(99,10656881),(113799,1501),(433318,2085),(442,948171),
+  (165380,1043),(28,14372905),(14880,50462),(2386,219918),(229,1797565),
+  (1174961,298),(3925,41833),(3903515,299),(15690452,111),(360860521,3),
+  (7440846,81),(2541026,507),(0,492448477),(6869,82469),(245,8322939),
+  (3503496,253),(123495298,0),(150963,2299),(33,4408482),(1,200911107),
+  (305,252121),(13,123369189),(215846,8181),(2440,65387),(776764401,1),
+  (1241172,434),(8,15493155),(81953961,6),(17884993,5),(26,6893822),
+  (0,502035190),(1,582451018),(2,514870139),(227,3625619),(49,12720258),
+  (1456769,207),(94797661,10),(234407,893),(26843,5783),(15688,24547),
+  (4091,86268),(4339448,151),(21360,6294),(397046497,2),(1227,205936),
+  (9966,21959),(160046791,1),(0,159992224),(27,24974797),(19177,29334),
+  (4136148,42),(21179785,53),(61256583,31),(385,344176),(7,11934915),
+  (1,18992566),(3488065,5),(768021,224),(36288474,7),(8624,117561),
+  (8,20341439),(5903,261475),(561,1007618),(1738,392327),(633049,1708)]

benchmarks/text-benchmarks.cabal

                   ghc-prim,
                   integer-gmp,
                   stringsearch,
-                  utf8-string
+                  utf8-string,
+                  vector
 
 executable text-multilang
   hs-source-dirs: haskell