1
1
mirror of https://github.com/github/semantic.git synced 2024-12-11 08:45:48 +03:00
semantic/bench/Evaluation.hs

83 lines
3.9 KiB
Haskell
Raw Normal View History

{-# LANGUAGE DataKinds, FlexibleContexts, PackageImports, PartialTypeSignatures, TypeApplications, TypeFamilies #-}
2019-10-04 19:37:24 +03:00
module Evaluation (benchmarks) where
2018-03-08 03:34:20 +03:00
import Algebra.Graph
import Control.Monad
2019-10-04 19:37:24 +03:00
import Control.Carrier.Parse.Simple
import qualified Data.Duration as Duration
import Data.Abstract.Evaluatable
import Data.Abstract.FreeVariables
import Data.Blob
import Data.Blob.IO (readBlobFromFile')
import Data.Bifunctor
import Data.Functor.Classes
2019-10-23 00:12:58 +03:00
import Data.Functor.Foldable (Base, Recursive)
import "semantic" Data.Graph (Graph (..), topologicalSort)
import Data.Graph.ControlFlowVertex
import qualified Data.Language as Language
import Data.Project
import Data.Proxy
import Data.Term
import Gauge.Main
import Parsing.Parser
import Semantic.Config (defaultOptions)
import Semantic.Graph
import Semantic.Task (SomeException, TaskSession (..), runTask, withOptions)
import Semantic.Util
import Source.Loc
2019-10-23 00:12:58 +03:00
import Source.Span (HasSpan)
import qualified System.Path as Path
import System.Path ((</>))
-- Duplicating this stuff from Util to shut off the logging
callGraphProject' :: ( Language.SLanguage lang
, HasPrelude lang
)
=> TaskSession
-> Proxy lang
-> Path.RelFile
-> IO (Either String ())
2019-10-23 18:45:45 +03:00
callGraphProject' session proxy path
| let lang = Language.reflect proxy
2019-10-25 21:34:54 +03:00
, Just (SomeParser parser) <- parserForLanguage analysisParsers lang = bimap (first show) (const ()) . runTask session $ do
2019-10-12 02:24:53 +03:00
blob <- readBlobFromFile' (fileForTypedPath 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
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
| let lang = Language.reflect proxy
, 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]
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
]