1
1
mirror of https://github.com/github/semantic.git synced 2024-12-18 12:21:57 +03:00
semantic/bench/Evaluation.hs

81 lines
3.8 KiB
Haskell
Raw Normal View History

2020-01-24 23:41:49 +03:00
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
2019-10-04 19:37:24 +03:00
module Evaluation (benchmarks) where
2018-03-08 03:34:20 +03:00
import Analysis.Project
2019-10-04 19:37:24 +03:00
import Control.Carrier.Parse.Simple
import Data.Abstract.Evaluatable
import Data.Bifunctor
2020-01-26 19:39:57 +03:00
import Data.Blob.IO (readBlobFromPath)
2020-01-24 23:41:49 +03:00
import qualified Data.Duration as Duration
import Data.Graph.Algebraic (topologicalSort)
import qualified Data.Language as Language
import Data.Proxy
import Gauge.Main
import Parsing.Parser
import Semantic.Config (defaultOptions)
import Semantic.Graph
import Semantic.Task (TaskSession (..), runTask, withOptions)
import Semantic.Util
import System.Path ((</>))
2020-01-24 23:41:49 +03:00
import qualified System.Path as Path
2020-01-26 19:39:57 +03:00
import qualified System.Path.PartClass as Path.PartClass
-- Duplicating this stuff from Util to shut off the logging
callGraphProject' :: ( Language.SLanguage lang
, HasPrelude lang
2020-01-26 19:39:57 +03:00
, Path.PartClass.AbsRel ar
)
=> TaskSession
-> Proxy lang
2020-01-26 19:39:57 +03:00
-> Path.File ar
-> IO (Either String ())
2019-10-23 18:45:45 +03:00
callGraphProject' session proxy path
| Just (SomeParser parser) <- parserForLanguage analysisParsers lang = fmap (bimap show (const ())) . runTask session $ do
2020-01-26 19:39:57 +03:00
blob <- readBlobFromPath (Path.toAbsRel path)
2019-10-23 18:45:45 +03:00
package <- fmap snd <$> runParse (Duration.fromSeconds 10) (parsePackage parser (Project (Path.toString (Path.takeDirectory path)) [blob] lang []))
modules <- topologicalSort <$> runImportGraphToModules proxy package
2019-10-25 21:34:54 +03:00
runCallGraph proxy False modules package
| otherwise = error $ "Analysis not supported for: " <> show lang
where lang = Language.reflect proxy
2019-10-23 18:45:45 +03:00
callGraphProject proxy paths = withOptions defaultOptions $ \ config logger statter ->
callGraphProject' (TaskSession config "" False logger statter) proxy paths
2019-10-23 18:48:01 +03:00
evaluateProject proxy path
| Just (SomeParser parser) <- parserForLanguage analysisParsers lang = withOptions defaultOptions $ \ config logger statter ->
fmap (const ()) . justEvaluating =<< evaluateProject' (TaskSession config "" False logger statter) proxy parser [Path.toString path]
| otherwise = error $ "Analysis not supported for: " <> show lang
where lang = Language.reflect proxy
2018-03-08 03:34:20 +03:00
pyEval :: Path.RelFile -> Benchmarkable
2019-10-23 18:48:01 +03:00
pyEval p = nfIO $ evaluateProject (Proxy @'Language.Python) (Path.relDir "bench/bench-fixtures/python" </> p)
2018-03-08 03:34:20 +03:00
rbEval :: Path.RelFile -> Benchmarkable
2019-10-23 18:48:01 +03:00
rbEval p = nfIO $ evaluateProject (Proxy @'Language.Ruby) (Path.relDir "bench/bench-fixtures/ruby" </> p)
pyCall :: Path.RelFile -> Benchmarkable
2019-10-23 18:45:45 +03:00
pyCall p = nfIO $ callGraphProject (Proxy @'Language.Python) (Path.relDir "bench/bench-fixtures/python/" </> p)
rbCall :: Path.RelFile -> Benchmarkable
2019-10-23 18:45:45 +03:00
rbCall p = nfIO $ callGraphProject (Proxy @'Language.Ruby) (Path.relDir "bench/bench-fixtures/ruby" </> p)
2018-03-08 03:34:20 +03:00
2019-10-04 19:37:24 +03:00
benchmarks :: Benchmark
benchmarks = bgroup "evaluation"
[ bgroup "python" [ bench "assignment" . pyEval $ Path.relFile "simple-assignment.py"
, bench "function def" . pyEval $ Path.relFile "function-definition.py"
, bench "if + function calls" . pyCall . Path.relFile $ "if-statement-functions.py"
, bench "call graph" $ pyCall . Path.relFile $ "if-statement-functions.py"
2018-03-12 17:51:07 +03:00
]
, bgroup "ruby" [ bench "assignment" . rbEval $ Path.relFile "simple-assignment.rb"
, bench "function def" . rbEval . Path.relFile $ "function-definition.rb"
, bench "if + function calls" . rbCall $ Path.relFile "if-statement-functions.rb"
, bench "call graph" $ rbCall $ Path.relFile "if-statement-functions.rb"
2018-03-08 03:47:23 +03:00
]
2018-03-08 03:34:20 +03:00
]