IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

Faire des benchmarks


Sujet :

Haskell

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut Faire des benchmarks
    Bonjour,

    Je souhaite faire des tests sur le temps d'exécution d'une fonction codé en Haskell. Je voudrais quelque chose d'à peu près portable (genre pas la commande time sous GNU/Linux ou l'équivalent Windows que je ne connais pas...).

    Je ne sais pas trop comment faire. J'ai téléchargé une archive pour ma plateforme (Windows XP SP2) du package (ou module je ne sais même pas la différence) nommé benchpress. Mais je ne sais pas quoi faire par la suite.


    Merci d'avance de m'indiquer la marche à suivre ou une astuce avec Prelude ou quelque chose dans le genre.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le "problème" pour benchmarker du Haskell, c'est que l'évaluation paresseuse peut tromper, c'est pour ça que bench() dans benchpress n'accepte que des actions IO en paramètre. Le code suivant prend une fonction pure et son paramètre et essaie de la benchmarker, mais je te conseille fortement de te méfier des résultat, fait varier le nombre de benchs et vérifie la consistence des résultats, par ailleurs, évite les optimisations quand tu compiles le module suivant (-O0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module BenchPure (benchIt) where
    import Control.Exception
    import Test.BenchPress
    import Control.Parallel.Strategies
     
    {-# NOINLINE benchIt #-}
    benchIt :: (NFData b) => Int -> (a -> b) -> a -> IO ()
    benchIt n f a = bench n $ do
    	      	      a' <- return a
    		      evaluate (f a' `using` rnf)
    EDIT : Si ton problème c'est d'installer benchpress, installe la plateforme Haskell puis exécute la commande suivante en ligne de commande (Invites de commandes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cabal update && cabal install benchpress
    --
    Jedaï

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut RE:
    Merci beaucoup.

    Il me reste par contre encore une question: comment on s'en sert Si tu pouvais me l'expliquer et/ou m'envoyer vers la doc que je ne trouve pas... Car je tente de remplacer f par une fonction nommée test qui effectue les calculs mais sans résultats...

    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il serait bon de montrer un peu de code de ton côté si tu veux que je t'aide avec les spécifiques.

    Un exemple d'utilisation serait :
    MapApp.hs (compilé avec -O2)
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    module MapApp (mapApp) where
     
    mapApp f ys xs = map f xs ++ ys

    BenchPure.hs (compilé avec -O0)
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module BenchPure (benchIt) where
    import Control.Exception
    import Test.BenchPress
    import Control.Parallel.Strategies
     
    {-# NOINLINE benchIt #-}
    benchIt :: (NFData b) => Int -> (a -> b) -> a -> IO ()
    benchIt n f a = bench n $ do
    	      	      a' <- return a
    		      evaluate (f a' `using` rnf)

    TestBenchIt.hs
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    module Main () where
    import BenchPure
    import MapApp
     
    main = benchIt 200 (mapApp (+ 2) [1..2000000 :: Int]) [1..1000000]

    --
    Jedaï

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut RE:
    Je te remercie encore de m'aider. Voilà le code (basique mais je me débrouille pas super bien avec Haskell ayant été coupé du monde pendant quelques semaines) :

    MathsApp.hs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module MathsApp (test) where
    import BenchPure
     
    isPrime n d | n == d          = True
                | mod n 2 == 0    = False
                | otherwise       = isPrime n (d+1)
     
     
     
    test n = benchIt 200 (isPrime n 2)
    BenchPure.hs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    module BenchPure (benchIt) where
    import Control.Exception
    import Test.BenchPress
    import Control.Parallel.Strategies
     
    {-# NOINLINE benchIt #-}
    benchIt :: (NFData b) => Int -> (a -> b) -> a -> IO ()
    benchIt n f a = bench n $ do
    	      	      a' <- return a
    		      evaluate (f a' `using` rnf)
    Cela me produit une erreur de type, je pense que c'est dû à ma mauvaise utilisation de Benchpress et de mes faibles compétences en Haskell. Si vous pouviez m'éclairer un peu, en me corrigeant et/ou expliquant mes erreurs, cela serait awesome .

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Ceci pourrait t'intéresser : http://hackage.haskell.org/package/criterion

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 03h25
  2. Faire des icônes
    Par Gnux dans le forum Gnome
    Réponses: 6
    Dernier message: 01/12/2003, 15h51
  3. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08
  4. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  5. Réponses: 8
    Dernier message: 18/09/2002, 03h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo