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

Free Pascal Discussion :

Optimisation de write sous Linux


Sujet :

Free Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut Optimisation de write sous Linux
    Bonjour,

    Je me remets au Pascal en ayant installé Free Pascal sur ma machine Linux. J'ai voulu comparer les performances avec C++/Gcc. En temps d'exécution user/système j'arrive à peu près au même temps sur le même programme. mais par contre sur le temps réel mon temps d'exécution est doublé sous FP. Je pense que ce temps vient d'un délai plus long pour écrire sur la sortie standard. D'ailleurs en enlevant les write j'arrive au même temps que le programme C++.

    D'où ma question existe-t-il une biliothèque free pascal optimisé pour Linux ? un moyen d'optimiser les sorties sous linux avec FP ?

    Ci-dessous les deux extraits de codes (FP et C++). Le but n'est pas d'optimiser l'algorithme je sais qu'il existe des façons de faire beaucoup plus efficace les deux programmes sont juste un moyen de faire deux boucles imbriquées afin d'avoir une complexité thêta2 donc ne jugez pas s'il vous plaît l'algorithme en lui même. Merci.

    J'aurais pu construire ma chaîne puis afficher le résultat qu'à la fin, mais la question est vraiment de savoir si on peut rendre les write plus efficaces en Free Pascal sous Linux. D'ailleurs c'est un peu ce qu'à lair de faire cout car l'affichage se fait par "à coup" comme s'il y avait une sorte de bufferisation alors qu'avec write sous FP on voit bien que chaque sortie est écrite au fur et à mesure.

    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
    program Premiers;
    uses sysutils;
     
    var limite,i,j: integer;
        prim : boolean;
     
    begin
    limite := strtoint(paramstr(1));
    for i := 1 to limite do
      begin
      prim := true;
      for j := 2 to (i-1) do
        begin
        prim := prim and (0<>(i mod j));
        end;
      if prim then write(i,', ');
      end;
      writeln();
    end.
    et en C++ on a la même chose :

    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
    #include <iostream>
    #include <cstdlib>
    using namespace std;
     
    int main(int argc, char* argv[]){
      if (argc < 2) {
        cout << "donnez un entier" << endl;
        return 1;
      }
      else if (argc >2) {
        cout << "donnez qu'un seul argument" << endl;
        return 2;
      }
      int x = atoi(argv[1]);
      for (int i = 1;i<=x;i++){
        bool prim = true;
        for(int j = 2; j < i ;j++)
          prim = prim && (i%j!=0);
        if (prim) cout << i << ", ";
      }
      cout << endl;
      return 0;
    }


    A vous lire.
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par PyNub Voir le message
    J'aurais pu construire ma chaîne puis afficher le résultat qu'à la fin, mais la question est vraiment de savoir si on peut rendre les write plus efficaces en Free Pascal sous Linux. D'ailleurs c'est un peu ce qu'à lair de faire cout car l'affichage se fait par "à coup" comme s'il y avait une sorte de bufferisation alors qu'avec write sous FP on voit bien que chaque sortie est écrite au fur et à mesure.
    Bonjour ! Il me semble que l'unité ncurses permet de faire ce genre de choses. (Je n'ai pas essayé : je n'ai que Windows et l'unité est disponible seulement pour Linux.)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Et merci pour la réponse. Ncurse est un bibliothèque permettant de faire des interfaces utilisateur sous unix/linux, je ne savais pas qu'elle avait été portée sous Free Pascal, c'est une bonne chose.

    Je pense que ce comportement vient de la façon de faire l'appel système depuis l'un ou l'autre des langages. J'ai découvert hier que l'on pouvait faire une sortie assembleur avec fpc (fort bien faite d'ailleurs) je vais comparer les deux. Comme je n'utilise pas de bibliothèque partagée ni de thread ça ne peut venir que de là....
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    En me promenant dans les exemples de Free Pascal, j'ai découvert l'unité gmp (que pour ma part je ne connaissais pas). Il y a une fonction mp_printf() qui mérite peut-être d'être regardée. J'ai fait pour moi-même un petit exemple pour retenir les différents types de données que la fonction accepte.

    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
    35
    36
    37
    38
    39
    40
    41
     
    { Free Pascal 2.6.4.
      Essai de la fonction mp_printf() de l'unité gmp.
      Essai effectué sous Windows 8.1.
      Nécessite gmp.dll.
    }
     
    program mp_printf_01;
     
    {$MODE OBJFPC}{$H+}
     
    uses
      gmp;
     
    var
      i: integer = 10;
      d: double  = 1 / 3;
      c: char    = 'a';
      s: string  = 'Free Pascal';
     
    { https://www.gnu.org/software/libc/manual/html_node/Table-of-Output-Conversions.html#Table-of-Output-Conversions
    }
     
    begin
      mp_printf('%d'#10, i); // 10
      mp_printf('%u'#10, i); // 10
      mp_printf('%o'#10, i); // 12
      mp_printf('%x'#10, i); // a
      mp_printf('%X'#10, i); // A
     
      mp_printf('%f'#10, d); // 0.333333
      mp_printf('%e'#10, d); // 3.333333e-001
      mp_printf('%E'#10, d); // 3.333333E-001
      mp_printf('%g'#10, d); // 0.333333
      mp_printf('%G'#10, d); // 0.333333
     
      mp_printf('%c'#10, c); // a
      mp_printf('%s'#10, @s[1]); // Free Pascal
      mp_printf('%p'#10, @s[1]); // 004100C8
      mp_printf('%%'#10); // %
    end.
    Personnellement, je suis sous Windows, mais je suppose que la chose fonctionne aussi sous Linux. (A noter que j'ai eu besoin de gmp.dll.)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Dans la mesure où le G de GMP signifie GNU oui je pense que cette librairie doit exister sous Linux :-) (Je dirais même qu'elle en vient). La question est surtout de savoir si elle est porté pour free pascal mais il n'y a pas de raison. En fait la libgmp est une librairie utilisé par pas mal de logiciel sous Linux elle permet de faire des calculs mathématiques de grande précision.

    Merci pour ton partage je vais essayer de voir ce que ça donne,
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

Discussions similaires

  1. [11g] Optimisation mémoire sous linux
    Par neGo33 dans le forum Administration
    Réponses: 3
    Dernier message: 23/01/2013, 12h32
  2. Réponses: 0
    Dernier message: 07/04/2011, 15h05
  3. Réponses: 10
    Dernier message: 07/07/2009, 14h25
  4. Optimisation d'OpenGL sous Linux
    Par erniubo dans le forum OpenGL
    Réponses: 5
    Dernier message: 23/12/2008, 11h44
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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