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

Défis langages fonctionnels Discussion :

Défi N°1 : Génération des ensembles de nombre dont la somme est identique


Sujet :

Défis langages fonctionnels

  1. #121
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ha oui tien,
    en ajoutant l'optimization des 1+1+....+1, et en evitant plusieur appèle récurssive, j'améliore nettement les perf
    je passe pour 100 de 30s à 5-6s
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    #include <iterator>
     
    //#define AFFICHER
    int nbvalue(0);
    typedef unsigned int DecompType;
     
     
     
    inline void afficher(const std::vector<DecompType> & myVect,const DecompType & nb)
    {
        nbvalue++;
        #ifdef AFFICHER
    	if (nb==0) return;
        std::cout<<"[";
        std::copy(myVect.begin(),myVect.begin()+nb-1,std::ostream_iterator<int>(std::cout,", "));
        std::cout<<myVect[nb-1]<<"]\n";
        #endif
    }
     
    //fonction récussive
    inline void generate(std::vector<DecompType> & myVect,const DecompType & reste ,const  DecompType & nb_precedent,const DecompType & level)
    {
    if (reste ==1)
    	{
    	myVect[level]=1;
    	afficher(myVect,level+1);
    	}
    else
    	{
    	//on interdit que le chiffre que l'on va traiter puisse etre plus grand que le précédent
    		for (DecompType i=std::min(reste,nb_precedent);i>1 ;--i)
    		{
    		//on met le chii=ffre courant à i
    		myVect[level] = i;	    
    		//on traite le prochain chiffre avec le reste
    		//si reste ==i alors la somme des chiffres est bien ègale au chiffre de dépard
    		//sinon on passe au chiffre suivant
    		if (reste==i) 
    			afficher(myVect,level+1);
    		else
    			generate(myVect,reste-i,i,level+1);
    		}
    	//cas ou le nombre courant est mis à 1
    	//td::vector<int>::iterator it = myVect.begin()+level;
    	myVect[level]=1;
    	myVect[level+reste-1]=1;
    	afficher(myVect,level+reste);
    	}
     
    }
     
    int main()
    {
        clock_t t1=std::clock();
        DecompType n =100;
        std::vector<DecompType> myVect(n);
        DecompType level (0);
        generate(myVect,n,n,level);
        clock_t t2=std::clock();
        std::cout<<nbvalue<<std::endl;
        std::cout<<double(t2-t1)/CLOCKS_PER_SEC<<std::endl;
    return 0;
    }

  2. #122
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    j'ai comparé avec le code de Steki-kun:
    pour 100
    moi : 0m1.656s
    Steki-kun: 0m2.304s

    pour 130 :
    moi : 0m56.012s
    Steki-kun: 1m3.160s

  3. #123
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Tu as pris ma version impérative compilée avec ocamlopt ?
    En tout cas c'est intéressant, la différence augmente en proportion bien plus faible que le nombre de partitions donc les complexités sont sensiblement les mêmes. J'aimerais bien voir d'où vient la différence si la technique est la même : tu as le code de ta version là ?
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  4. #124
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Steki-kun Voir le message
    Tu as pris ma version impérative compilée avec ocamlopt ?
    En tout cas c'est intéressant, la différence augmente en proportion bien plus faible que le nombre de partitions donc les complexités sont sensiblement les mêmes. J'aimerais bien voir d'où vient la différence si la technique est la même : tu as le code de ta version là ?
    oui sous ubuntu. Par contre je ne sait pas si il faut ajouter des option a la compilation. je ne connait pas ocamlopt
    Pour le code je l'ai mis juste avant.
    [edit]
    les résultats ne sont pas les même car ce n'est pas le même PC.

  5. #125
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    OK ! Pour les options, rien à rajouter à ocamlopt -unsafe à la limite ca accélerera un chouia les acces tableaux...
    Edit : Je viens de changer un chouia en remplaçant comme JMB le paquet de 1 dans l'implémentation impérative par leur nombre, je descends à 53s pour n=130, 2.1s pour n=100. A ce niveau là, time ne permet plus de faire la comparaison raisonnablement, je crois qu'on peut dire ex aequo

    Les boucles à changer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    let visit a m q = 
      sol := add !sol one;
      let e = if m = q then q-1 else q in
        for i = 1 to e do
          Printf.printf "%d+" a.(i)
        done;
        if m = q then 
          print_endline (string_of_int a.(q))
        else
          (for i = 1 to m-q-1 do
    	 Printf.printf "1+"
           done;
           print_endline "1")
    
    let rec copy_loop a n m x =
      if n <= x then n, m
      else 
        (a.(m) <- x;
         copy_loop a (n-x) (m+1) x)
    
    let rec main_loop a n m q =
      if !debug then visit a m q;
      if a.(q) = 2 then
        main_loop a n (m+1) (q-1)
      else
        if q = 0 then ()
        else
          begin
    	let x = a.(q) - 1 in
    	  a.(q) <- x;
    	  let n,m = copy_loop a (m-q+1) (q+1) x in
    	    a.(m) <- n;
    	    main_loop a n m (if n = 1 then m-1 else m)
          end
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  6. #126
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    j'ai réussi a diviser par 2.5/3 le temps

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    #include <iterator>
     
    //#define AFFICHER
    int nbvalue(0);
    typedef int DecompType;
     
    inline void afficher(const std::vector<DecompType> & myVect,const DecompType   & end)
    {
        nbvalue++;
     
        #ifdef AFFICHER
     
        std::cout<<"[";
        std::copy(myVect.begin(),myVect.begin()+end,std::ostream_iterator<int>(std::cout,", "));
        std::cout<<*(myVect.begin()+end)<<"]\n";
        #endif
    }
     
    template <DecompType debut >
    struct myFOR;
     
     
    //class template qui empêche que le chiffre courant soit suppèrieur au chiffre d'avant
    //et lance une boucle for pour décrementer le chiffre
    //traite le cas chiffre == 1
    template <DecompType reste >
    struct generate2
    {
        template<DecompType nb_precedent>
        static inline void faire(std::vector<DecompType> &myVect,const DecompType &   level)
            {
            //std::cout<<"generate2"<<std::endl;
            myFOR< reste<nb_precedent? reste:nb_precedent >::template faire<reste> (myVect,level);
            myVect[level]=1;
     
            myVect[level+reste-1]=1;
            afficher(myVect,level+reste-1);
            }
     
     
    };
    //SPECIALISATION
    // si  le reste vaut 0 on affiche le résultat
    template < >
    struct generate2<0>
        {
     
        template<DecompType nb_precedent>
        static inline void faire(std::vector<DecompType> &myVect,const DecompType  &  level)
            {
           //    std::cout<<"generate2<1>"<<std::endl;
            myVect[level]=1;
            afficher(myVect,level+1);
            }
        };
    //BOUCLE FOR "déroulé"
    //decremente le nombre courant et demande une generation pour le chiffre suivant
    // ou affiche quand le rest vaut 0
    template <DecompType Valeur >
    struct myFOR
    {
        template<DecompType    reste>
        static inline void faire(std::vector<DecompType> &myVect,const DecompType & level)
        {
            myVect[level] = Valeur;
            if (reste==Valeur)
                afficher(myVect,level);
            else
               generate2<reste-Valeur>::template faire<Valeur>(myVect,level+1);
     
     
            myFOR<Valeur-1>::template faire<reste>(myVect,level);
     
        };
     
    };
    //SPECIALISATION
    //quand Valeur vaut 1 la boucle est fini
    template < >
    struct myFOR<1>
    {
     template<DecompType    reste>
        static inline void faire(std::vector<DecompType> &myVect,const DecompType   & level)
        {
        };
    };
     
     
    int main(int argc,char ** argv)
    {
        const DecompType n =100;
        std::vector<DecompType> myVect(n);
        myVect[0]=n;
        nbvalue=0;
        clock_t t1=std::clock();
            generate2<n>::faire<n>(myVect,0);
        clock_t t2=std::clock();
        std::cout<<nbvalue<<std::endl;
        std::cout<<double(t2-t1)/CLOCKS_PER_SEC<<std::endl;
     
    return 0;
    }
    Mais bon c'est à cout de déroulement de boucle (pseudo metaprog, je ne mis connait pas encore assez, c'est mon premier)... La je suis obligé de connaitre le nombre avant le lancement...
    Mais cette méthode peut accélérer un morceau du calcul. Par exemple des qu'il reste 50, j'appel ce nouveau code
    Je ne sait pas si d'autre langages permettent de faire ca..
    surtout en fonctionnel

  7. #127
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    euh STOP je t'arrête là, avec les mêmes techniques je calcule la factorielle en O(1)... Là tu fais faire les calculs à ton compilo à la place de ton programme, alors évidemment il reste plus grand chose à faire en runtime. C'est pas le but de l'exercice
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  8. #128
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Steki-kun Voir le message
    euh STOP je t'arrête là, avec les mêmes techniques je calcule la factorielle en O(1)... Là tu fais faire les calculs à ton compilo à la place de ton programme, alors évidemment il reste plus grand chose à faire en runtime. C'est pas le but de l'exercice
    Oui et non il donne et peut afficher toute les solution!!!
    Citation Envoyé par millie
    Les règles

    Il n'y a pas de règle particulière (évidemment, il faut que la solution proposée fonctionne). Vous pouvez proposer des solutions aussi bien dans des langages fonctionnels (caml, haskell, scheme, lisp...) qu'impératif. Le public pourra ainsi juger du code suivant divers critères :

    * la maintenabilité
    * la simplicité
    * le fait qu'il soit optimisé
    maintenabilité = bof
    simplicité = bof
    optimisé = beaucoup

    Ici la boucle for et les appelles récursive sont déroulé.
    Il reste donc le plus couteux : l'accès en mémoire!!!
    Le but est juste de montrer ce que l'on peut faire en C++
    En faite, je me demande surtout si c'est possible de faire ça en langage fonctionnelle.

    Mais je suis d'accord que ce code n'apporte rien a part l'optimisation

  9. #129
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    En faite, je me demande surtout si c'est possible de faire ça en langage fonctionnelle.
    Le système de templates de C++ est un langage fonctionnel (et turing-complet).

    Common Lisp possède un système de macros puissants, il est peut-être possible de faire ça aussi, à la compilation.

  10. #130
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    Reste que l'utilisation de trucs de ce genre ne relève pas vraiment d'une opposition de style impératif / fonctionnel. C'est assez rarement un bon design de programmation puisque ça ne marche pas pour tout n et que l'air de rien ca fait méchamment grossir l'exécutable.
    Et au risque d'être cynique, je dirais que si vraiment on veut dérouler des piles de 500 appels sans le faire "à la main", quel que soit le langage, on peut toujours étant donné un programme P qui fait un nombre constant de boucles et d'appels récursifs, faire un programme qui va écrire sur la sortie standard une version entièrement déroulée du programme P... Que le compilateur t'offre la possibilité de le faire pour toi -- moyennant incantations templatisantes de ton code original, c'est un autre problème
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  11. #131
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Steki-kun Voir le message
    Reste que l'utilisation de trucs de ce genre ne relève pas vraiment d'une opposition de style impératif / fonctionnel. C'est assez rarement un bon design de programmation puisque ça ne marche pas pour tout n et que l'air de rien ca fait méchamment grossir l'exécutable.
    C'est un style de programmation a part entière que te permet le C++. Aprés il ne faut pas en abuser c'est sur. La c'est un gros abut de ma part, j'avoue. Mais je pourrai m'en servire pour optimiser qu'une partie du code. Par exemple des qu'un chiffre est à 5.
    Citation Envoyé par Steki-kun Voir le message
    Et au risque d'être cynique, je dirais que si vraiment on veut dérouler des piles de 500 appels sans le faire "à la main", quel que soit le langage, on peut toujours étant donné un programme P qui fait un nombre constant de boucles et d'appels récursifs, faire un programme qui va écrire sur la sortie standard une version entièrement déroulée du programme P... Que le compilateur t'offre la possibilité de le faire pour toi -- moyennant incantations templatisantes de ton code original, c'est un autre problème
    Bien sur, mais je ne me voit pas dérouler a la main les 190 569 292 solutions. Qu'un language le permet, ajouter beaucoup d'interet.
    Dans un code, il y as trés souvent des morceaux où les variables sont connu. Mais le compilot ne va pas spécialement dérouler les boucle.... mais avec ce style de programmation tu peut l'obliger. Dans le même style dans ce code :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    myTab tabres,tab1,tab2,tab3;//tableau avec N element
    ....//init de tab1,tab2 et tab3
    tabres = tab1+tab2*tab3
    avec ce même style de programmation, on peut obliger le compilot a le traduire par :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tabres.resize(Tabtmp2.res());
    for (int i=0;i<tab1.res();++i)
    {
    tabres[i]  = tab1[i] + tab2[i] * tab3[i];
    }
    au lieu de

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    //multiplication
    myTab Tabtmp1(tab2.size());
    for (int i=0;i<Tabtmp1.res();++i)
    {
    Tabtmp1[i]  = tab2[i] * tab3[i];
    }
    //addition
    myTab Tabtmp2(Tabtmp1.size());
    for (int i=0;i<Tabtmp2.res();++i)
    {
    Tabtmp2[i]  = tab1[i] + Tabtmp1[i];
    }
    //egale
    tabres.resize(Tabtmp2.res());
    for (int i=0;i<Tabres.res();++i)
    {
    tabres[i]  =  Tabtmp2[i];
    }

  12. #132
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par LLB Voir le message
    [...]
    Common Lisp possède un système de macros puissants, il est peut-être possible de faire ça aussi, à la compilation.
    C'est possible. Les macros récursives existent.
    Mais c'est très peu recommandé d'en abuser.

    Sérieusement mongaulois, il va falloir faire un effort sur l'orthographe

    Vis-à-vis des tes optimisations, sais-tu que les performances sont rarement un problème sur des projets ? Et qu'il vaut mieux investir dans une bonne conception et une bonne documentation que dans une bonne performance ? Il me semble que tu n'as fait ça que pour le challenge cependant. Ce qui est fort bien dans ce cas. Mais la lisibilité est très basse aussi.

  13. #133
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    C'est possible. Les macros récursives existent.
    Mais c'est très peu recommandé d'en abuser.
    L'abus serait moins grand que l'abus des templates...

    Et si on veut citer d'autres langages complets a la compilation, il y a aussi au moins Forth, PL/I, la plupart des macro-assembleurs. Meme les macros du C peuvent etre poussee a bout pour faire bien plus que ce que croient la plupart des gens (voir par exemple la section de boost sur le preprocesseur).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #134
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pour ce que ca interesse:
    un petit bench sur un problème entre différents language
    http://www.ffconsultancy.com/ocaml/r...languages.html

  15. #135
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Pour ce que ca interesse:
    un petit bench sur un problème entre différents language
    http://www.ffconsultancy.com/ocaml/r...languages.html
    En même temps, les mini bench, ça montre tout et surtout n'importe quoi
    Je ne répondrai à aucune question technique en privé

  16. #136
    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
    Citation Envoyé par Mongaulois Voir le message
    Pour ce que ca interesse:
    un petit bench sur un problème entre différents language
    http://www.ffconsultancy.com/ocaml/r...languages.html
    D'un autre côté ce n'est pas non plus vraiment un "mini"-bench, c'est un moyen.

    Comparaison avec Haskell :
    http://augustss.blogspot.com/2007/11...askell-vs.html

    --
    Jedaï

  17. #137
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par millie Voir le message
    En même temps, les mini bench, ça montre tout et surtout n'importe quoi
    C'est un très bon exemple.
    Ce code montre qu'on peut avoir élégance et efficacité avec un programme qui a besoin d'efficacité (c'est un ray tracer). Et l'exemple qui suit en Haskell (cf. le message de Jedai) montre que ocaml n'est pas le seul dans ce cas.

    Je l'ai déjà posté. Flying Frog Consultancy utilise ocaml pour du calcul scientifique.

  18. #138
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    C'est un exemple sur un petit code... Je ne sais pas si ça vaut grand chose.

    Par exemple, Java va forcement avoir de mauvais statistiques car Hot Spot ne va pas être vraiment utilisé puisque l'exécution est courte donc le résultat est forcement biaisé Et dans l'industrie, je ne suis pas sûr que des applications aussi courtes courent les rues.

    Si ce code était intégré à une vrai application et qu'il y aurait des milliers d'appels alors Hot Spot optimiserait/compilerait en natif le code donc les statistiques ne seraient plus les mêmes.
    Je ne répondrai à aucune question technique en privé

  19. #139
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Jedai Voir le message
    D'un autre côté ce n'est pas non plus vraiment un "mini"-bench, c'est un moyen.
    200 lignes pour l'entrée la plus longue, moyen? C'est pas un mini-bench, c'est micro-bench.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #140
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    200 lignes pour l'entrée la plus longue, moyen? C'est pas un mini-bench, c'est micro-bench.
    Alors as tu un vrai bench??

    Pour moi un bench entre languagene peut montrer que la relation verbosité-rapidité d'un language par rapport à un problème. Et c'est en ca que le lien que je donne me semble un bon bench. Tous comme les codes créé dans ce thread

    Je pense que pour l'instant,
    il y as toujours une solution plus rapide en C et C++,mais souvent avec un code plus verbeux, car ces compilateur est plus evolué,optimisé. Mais d'autre language seront toujours plus adapté à un problème donné, avec un code plus lissible et de trés bonne performance.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/07/2015, 07h26
  2. Réponses: 8
    Dernier message: 20/03/2015, 15h21
  3. Réponses: 9
    Dernier message: 03/11/2009, 16h39
  4. Rechercher les nombres dont la somme est donnée
    Par TMuet dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 17/08/2009, 17h17
  5. Extraire lignes dont le debut est identique
    Par Raoul555 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/05/2007, 11h01

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