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

WinDev Discussion :

Windev vs Java : crible d'Ératosthène


Sujet :

WinDev

  1. #21
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    bonjour,

    finalement, on peut appeler du code java à partir de windev. Voici la façon d'appeler la fonction de calcul du crible d'Eratosthene à partir de windev :

    1 - voici le code source java qui permet d'être appelé à partir de windev :
    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
     
    import java.util.BitSet;
    public  class Erato {
         public static int moncalcul(int N)
        {
            		BitSet isPrime2 = new BitSet(N + 1);
     
    		for (int i = 2; i * i <= N; i++) {
    			if (!isPrime2.get(i)) {
    				for (int j = i; i * j <= N; j++) {
    					isPrime2.set(i * j);
    				}
    			}
    		}
    		int primes2 = N - 1 - isPrime2.cardinality();
                    return primes2;
    }
    }
    il faut compiler et cela donne (comme mon projet s'appelle BiblioJava) un BiblioJava.jar

    2 - dans windev en initialisation il faut charger le jar par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JavaCharge("BiblioJava.jar")
    3 - et voici le code qui appelle la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    elapsedTime est une Durée
    compt est un entier
    ChronoDébut()
    compt = JavaExécuteFonction("Erato","moncalcul",javaEntier,10000000)
    elapsedTime =  ChronoFin()
    Memo += RC + " Résultat crible d'Eratosthene (10000000) par java  :  " + compt +  " -  temps écoulé  :  " + elapsedTime + " ms"

    et voici ce que j'obtiens en temps écoulé :

    en générant un exécutable 32 bits :
    avec un appel au code java : 360 ms
    avec du code windev : 7800 ms

    en générant un exécutable 64 bits :
    avec un appel au code java : 120 ms
    avec du code windev : 8990 ms

    Ami calmant J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #22
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Donc si je comprends bien on appelle tout aussi facilement du java que du c que du dotnet depuis WinDev ! Tout cela confirmé par ce post !

    Bien joué à tous
    Emmanuel Lecoester
    => joomla addict.

  3. #23
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    pour ajouter à l'optimisation, la dernière boucle qui parcoure tout le tableau est 2 fois trop longue en temps de traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nCompteur = 1
    POUR i = 3 _A_ nNum PAS 2
    	SI PAS tabFlags[i] ALORS
    		nCompteur++
    	FIN
    FIN


    à bientôt,

    Nicolas

  4. #24
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    bonjour,

    bien vu Nicolas pour l'astuce de ne pas compter les nombres pairs. J'obtiens maintenant en code windev un temps de 6990 ms au lieu de 7800 ms

    Entre temps j'ai réussi à compiler le code d'hibernatus en c++ avec CodeBlocks - Mingw ( gcc,g++) et la librairie Boost. J'obtiens un temps de 52 ms.

    Pour finir, j'ai créé une dll en free pascal ( version 2.4.2). Voici le code :
    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
    42
    43
     
    library eratopascal;
    {$ifdef FPC}{$mode objfpc}{$h+}{$endif}
    uses
      SysUtils,
      Classes;
     
    Function Eratosthene(size:integer):integer;stdcall;
         var
            flags: tbits;
            i,k,count:integer;
     
    begin
            flags := tbits.Create;
            flags.Size := size + 1;
            flags.clearall();
            i:=2;
            while  (i*i <= size) do
              begin
                    if not flags[i] then begin
                            k:=i;
                            while k*i<=size do begin
                                    flags[k*i]:=true;
                                    inc(k);
                            end;
                    end;
             inc(i);
             end;
             Count :=1;
             i:=3;
           while i<= size do 
           begin
              if not flags[i] then  inc(Count);
           inc(i,2);  
           end;
           flags.Free;
           Result :=Count;
        end;
     
    exports  Eratosthene;
     
    begin
    end.
    en le compilant cela donne le fichier eratopascal.dll
    et voici comment j'appelle la dll dans Windev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    elapsedTime est une Durée
    compt est un entier
    hInst est un entier système
    hInst = ChargeDLL("eratopascal.dll")
     
    SI hInst = 0 ALORS
    	Erreur("Erreur lors du chargement : " + ErreurInfo())
    SINON
    ChronoDébut()
    compt= AppelDLL32("eratopascal","Eratosthene",10000000)
    elapsedTime =  ChronoFin()
    Memo += RC + " Résultat crible  par pascal  :  " + compt +  " -  temps écoulé  :  " + elapsedTime + " ms"
    FIN
    J'obtiens un temps de 210 ms.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #25
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Bonjour,

    j'ai fini par réussir à appeler du code java à partir d'un exécutable linux windev WD16 sous linux .La librairie dynamique que cherche windev est jvm.so qui n'existe pas sous linux et qui devrait être libjvm.so. De plus il faut indiquer l'endroit où se trouve la librairie dynamique.
    ma config :
    linux UBUNTU 10.4 32 bits dans virtualBox avec libqt 4 .Le java que j'utilise est icetea openjdk6.
    le chemin de libjvm.so : /usr/lib/jvm/java-6-openjdk/jre/lib/i386/client

    voilà donc je que j'ai fait :
    lien symbolique :
    cd /usr/lib/jvm/java-6-openjdk/jre/lib/i386/client
    sudo ln -s libjvm.so jvm.so

    pour le chemin :
    export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:$LD_LIBRARY_PATH

    j'arrive ainsi à faire fonctionner ce code sous linux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    elapsedTime est une Durée
    compt est un entier
    ChronoDébut()
    compt = JavaExécuteFonction("Erato","moncalcul",javaEntier,10000000)
    elapsedTime = ChronoFin()
    Memo += RC + " Résultat crible d'Eratosthene (10000000) par java : " + compt + " - temps écoulé : " + elapsedTime + " ms"
    avec en initialisation de fenêtre le chargement du jar où se trouve la classe Erato qui contient la fonction moncalcul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JavaCharge("BiblioJava.jar")
    J'obtiens sous Linux un temps de 390 ms en java contre 17 s pour windev.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #26
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Hyper intéressant ton étude jurassic pork.
    Citation Envoyé par jurassic pork Voir le message

    J'obtiens sous Linux un temps de 390 ms en java contre 17 s pour windev.
    J'en déduis qu'il faut arrêter Windev et passer à Lindev
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  7. #27
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Je pense que ce thread a inspiré une nouveauté de WD17 : optimisation des tableaux en compilation JIT.
    Depuis j'ai eu besoin de cet algo pour autre chose (une sorte de jeu de maths), et je suis descendu à 18 ms en C++ sans rien faire de génial.
    Certains prennent moins de 1 ms en C++.
    Pour 10^8 j'ai 160 ms en C++.

Discussions similaires

  1. Algorithme Crible d'Ératosthène en distribué (application réparti)
    Par tomap3 dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 12/07/2010, 15h15
  2. windev ou Java?
    Par sarah_insat dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 02/06/2008, 22h06
  3. Réponses: 5
    Dernier message: 10/12/2007, 19h41
  4. Réponses: 0
    Dernier message: 04/12/2007, 02h44
  5. WinDev versus Java
    Par Tijee dans le forum WinDev
    Réponses: 4
    Dernier message: 29/01/2006, 10h15

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