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

C# Discussion :

Rapidité Division BigInteger


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Rapidité Division BigInteger
    Bonjour,

    J'aurai aimé savoir si quelqu'un connaitrait une méthode plus rapide que l'opérateur / pour faire une division entre deux BigInteger.

    Je dois faire 15000 divisions de ce type et ca me prend plus de 20sec et comme je vais devoir en faire plus je me demandais s'il existait une autre méthode.

    Cordialement

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 141
    Points : 201
    Points
    201
    Par défaut
    Salut,

    As-tu essayé en faisant une multiplication par l'inverse de ton diviseur ?
    Je ne sais pas si c'est plus rapide qu'une division, mais ça vaut le coup d'essayer...

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    L'inverse de mon diviseur ne sera pas un entier donc je dois assigner á une autre variable á chaque boucle (car ce n'est pas toujours le meme diviseur) donc ca prend plus de temps et comme mon diviseur est un BigInteger lorsaue je prend l'inverse mon calcul devient "arrondi" et je n'ai plus le bon résultat.

    Merci quand meme

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par spottt Voir le message
    Salut,

    As-tu essayé en faisant une multiplication par l'inverse de ton diviseur ?
    Il a dit qu'il utilisait des BigInteger.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Bonjour,

    Citation Envoyé par CSharpN Voir le message
    Je dois faire 15000 divisions de ce type et ca me prend plus de 20sec et comme je vais devoir en faire plus je me demandais s'il existait une autre méthode.
    Non; c'est le problème avec les BigInteger, il n'existe pas d'instructions de manipulation native de ces structures dans le système (alors que le processeur a des instructions spécifiques pour les nombres à virgules flottante, par exemple), et la bibliothèque doit faire des opérations décomposées avec des "long" combinés en opérant les retenues dans le code => c'est long.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 141
    Points : 201
    Points
    201
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il a dit qu'il utilisait des BigInteger.
    Yes, l'expression a été plus vite que la réflexion, désolé.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par spottt Voir le message
    Yes, l'expression a été plus vite que la réflexion, désolé.
    Pas grave, ça arrive

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour.

    Soit tes entiers sont vraiment énormes (>1E1000000), soit le problème vient d'ailleurs. Parce que si je veux bien croire que la division de BigInteger soit plus lente qu'une division normale, là on serait à plus de 1ms par division ?! Cela voudrait dire qu'il faut plus d'un million d'opérations par division, c'est ridicule.

    Je doute donc fortement que cette pauvre division soit la responsable.

  9. #9
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Tout à fait d'accord, envoie nous ton code et on pourra voir et même voire tester

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je me suis trompé, c'est 150000 divisions pas 15000 et je suis sure que le probleme vient de la division puisque j'ai mis le reste de mon programme en commentaire pour faire les mesures de temps.

    Mes nombres sont grands donc je suppose que je peux pas faire mieux que / .

    Je ne peux pas poster mon code car je ne l'ai pas sur cet ordinateur, si vous pensez qu'il est vraiment nécessaire je peux essayer d'aller le récupérer.

    Cordialement

  11. #11
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Même en multipliant par dix, c'est beaucoup trop lent. Pourrais-tu nous donner un ordre de grandeur pour tes nombres et le contexte (que représentent ces nombres) ? Et, oui, personnellement j'aimerais voir le code, il doit y avoir un truc.

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Pardon c'est ma faute je ne donne pas les bonnes informations.

    En comptant toutes mes boucles correctement je fais un peu plus de 19 200 000 cette division (qui change á chaque fois bien sur).

    les 153 600 premieres fois j'ai P/Q avec P : 4 octets et Q : 2 octets
    Puis j'ajoute 2 octets á P et 1 á Q toutes les 153 600

    (Je fini avec P vers 128 et Q vers 64 je crois)

  13. #13
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Ok, ça change pas mal de choses.
    Donc nous sommes à une microseconde par division, soit 1000 instructions environ. C'est malheureusement très raisonnable. On pourrait envisager de réécrire un BigInteger spécialisé pour ton cas et on pourrait peut-être ainsi diviser par 2 à 8 le temps de calcul (surtout en louchant du côté du code unsafe et de Mono.Simd pour une implémentation encore plus efficace). C'est fastidieux toutefois et les résultats ne sont pas garantis. Un peu plus simple et sans doute au moins aussi efficace, la GNU MP : développer des wrappers pour celle-ci ou carrément porter la partie calcul du code en C/C++ non-managé en s'appuyant sur elle.

    Une autre approche plus rudimentaire serait, si ton problème est parallélisable, d'utiliser tous les coeurs du processeur. Le gain théorique serait de 2 à 8 selon les machines. Voire, à supposer que le problème s'y prête, avoir recours au GPU. Évidemment cette dernière solution serait de loin la plus complexe à mettre en oeuvre, même en s'appuyant sur des biblios avancées (comme la dernière-née des biblios de MS pour dotnet et dont le nom m'échappe), mais le gain potentiel est énorme (disons 20x à 100x).

    Enfin, tout simplement, n'y a t-il pas un algorithme plus efficace pour résoudre ce problème ? C'est généralement la première chose à considérer.

  14. #14
    Futur Membre du Club
    Inscrit en
    Mars 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Malheureusement mon probleme n'est pas parallélisable puisque j'ai besoin du résultat précédent pour passer á l'instance suivante de ma boucle, je suppose donc que les solutions proposées dans le deuxieme paragraphe ne sont pas envisageable (dommage car x20 aurait été parfait).

    Ceci dit j'ai commencé le c# il y a seulement 1 mois donc je connais pas encore comment passer en c/c++ (j'ai lu quelques choses dessus) donc je vais essayer de voir si je peux passer par lá.

    Pour ce qui est de changer l'algorithme, malheureusement non, j'ai déjá fait pas mal de recherche dessus et il semblerai que ca soit la seule maniere de faire.

    Merci d'avoir pris le temps de me répondre malgré mes explications un peu bancale parfois.

    Cordialement

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Bonjour,

    si on voyait déjà ton code on pourrait peut être t'aider pour l'optimiser.

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. NMHTTP prob de rapidité
    Par Goldocrack dans le forum C++Builder
    Réponses: 7
    Dernier message: 06/08/2003, 00h12
  3. Fonction divisant argument de type inconnu
    Par Nasky dans le forum C
    Réponses: 9
    Dernier message: 29/07/2003, 00h32
  4. Rapidite enregistrement
    Par mika dans le forum Débuter
    Réponses: 9
    Dernier message: 25/04/2003, 15h15
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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