Il y a actuellement 236 visiteurs
Vendredi 19 Avril 2024
accueilactualitésdossierscomparer les prixtélécharger gratuitement vos logicielsoffres d'emploiforum informatique
Connexion
Créer un compte

Algorithme, mémoire et performance

Besoin d'aide pour configurer un serveur ? Vous souhaitez obtenir des conseils pour référencer votre site ? Un petit souci pour accéder à votre FTP ? Des soucis de programmation en PHP / ASP / HTML / XHTML / XML / XSLT / CSS / ReactJS / AngularJS / VueJS / CGI / PERL / C / MySQL / PostgreSQL ??? Nous avons peut-être la solution dans ce forum ...

Algorithme, mémoire et performance

Message le 19 Avr 2012 21:38

Bonsoir à tous ! :D

Ayant fini mes études en informatique, je me suis lancé dans un projet de jeu-vidéo en 2D en Java avec mon cousin.
Pas trop d'informations pour l'instant, classé confidentiel. 8)

Bref, grâce à l'IUT j'ai appris beaucoup de choses, et notamment en algorithme, un truc que j'adore. Cependant, même si j'arrive plutôt bien à coder de façon optimiser, j'ai quelques questions en tête.

--------------------------------------------------------------------------------------------------------------------------------
Les boucles
Déjà là je suis sur un traitement de tableaux, et j'utilise des boucles for.
Et je me suis rendu compte que finalement, lorsque j'ai un résultat je pourrais arrêter l'une de ses boucles en plein milieu.
Pourquoi est-ce mal d'utiliser l'instruction break dans une boucle for ?
Je pensais qu'il y avait une raison au niveau de la mémoire, mais en regardant vite-fait sur Internet, apparemment il s'agit simplement d'une question de lisibilité de code.
Or dans mon cas, je trouve ça beaucoup plus lisible d'utiliser un simple break plutôt que d'avoir des conditions à rallonge dans les instructions de boucles.
--------------------------------------------------------------------------------------------------------------------------------
Le parcours d'un tableau
Code: Tout sélectionner
for (int i=0 ; i<tableau.length) ; i++) {}

Code: Tout sélectionner
int taille = tableau.length ;
for (int i=0 ; i<taille) ; i++) {}

Code: Tout sélectionner
short taille = (short) tableau.length ;
for (short i=0 ; i<taille) ; i++) {}

Lequel est le plus performant entre ces trois là ? Est-il vrai que pour le premier cas, à chaque itération il va calculer la taille du tableau ? Et pour un tableau de petite taille fixe, est-il préférable d'utiliser un short plutôt qu'un int ?
Cela paraît un peu trop infime, mais j'ai besoin de faire beaucoup de calculs par seconde, et même les nanosecondes comptent ! :D Non je plaisante, mais j'aime être le plus performant possible.
--------------------------------------------------------------------------------------------------------------------------------
Les variables et variables de classes
Code: Tout sélectionner
class A { int poids = 8 ; int getPoids(){ return this.poids } }
class B { ...{ for (int i=0 i<a.getPoids() ; i++) {} } }

Code: Tout sélectionner
class A { int poids = 8 ; int getPoids(){ return this.poids } }
class B { ...{ int p = a.getPoids() ; for (int i=0 i<p ; i++) {} } }

Y a-t-il une différence de temps d'accès à la valeur 8 ? Bon dans cet exemple c'est inutile, mais si dans une quadruple boucle, toute de taille en milliers, on calcul via la même valeur d'une variable de classe - mieux vaut la stocker dans un variable hors des boucles ou le temps d'accès à la méthode get() est de toute façon quasiment nulle ? (Si cela dépasse 0,2ms, j'utiliserais la seconde méthode en exemple. :wink: )
--------------------------------------------------------------------------------------------------------------------------------

Voilà voilà, pour l'instant c'est tout ce qui me trotte dans la tête. :) Bon là c'est du Java, mais bien sûr je pose la question pour tous les langages.
Merci d'avance pour vos réponses !
Avatar de l'utilisateur
Thyrion
Expert(e)
Expert(e)
 
Messages: 1253
Inscription: 25 Aoû 2007 19:49
 


Re: Algorithme, mémoire et performance

Message le 19 Avr 2012 22:50

Salut,

Alors, dans l'ordre :

Thyrion a écrit:Pourquoi est-ce mal d'utiliser l'instruction break dans une boucle for ?


La réponse est simple : l’énorme avantage d'une boucle for, c'est que tu sais exactement combien de passages tu fais, ce qui n'est pas le cas avec while ou do while. Pour évaluer la complexité de ton algo (le fameux O(N)), il faut que tu saches combien de passages tu fais dans tes boucles, dans le pire des cas...

Thyrion a écrit:Lequel est le plus performant entre ces trois là ?


Hum... je ne suis pas sur là. Si ce qui t'intéresse, c'est la puissance de calcul, et non l'allocation mémoire (le fait d'allouer des variables plus grandes n'affecte pas la puissance, seulement la place qu'occupe ton programme en mémoire), il faut réfléchir en terme de nombre d'opérations. En gros, réserver un short ou un int, c'est kif kif au niveau du processeur, ça bouffe juste un poil plus de mémoire. Si ça t'évite de faire des conversions, c'est bon à prendre.

Thyrion a écrit:Y a-t-il une différence de temps d'accès à la valeur 8 ?


le premier algo est plus performant, tu fais une allocation mémoire en moins.

Après, il y a un autre truc en Java, c'est de savoir quelle structure de donnée utiliser. Par exemple, les tableaux c'est bien, mais il faut connaître la taille, et ne pas avoir à faire d'insertions. Les insertions dans les tableaux sont lentes, alors que les lectures sont rapides (car tu connais l'id). A l'inverse, les listes sont intéressantes si tu veux faire de l'empilage et du dépilage, mais pour la lecture d'un item particulier, c'est lent...

Un peu de lecture : http://moukouop.developpez.com/tutoriel ... es/#LIII-A

Bon courage ! ;)
Avatar de l'utilisateur
H3bus
Moderateur
Moderateur
 
Messages: 12195
Inscription: 08 Avr 2008 15:13
Localisation: /home/h3bus
 

Re: Algorithme, mémoire et performance

Message le 19 Avr 2012 23:41

Ah nickel, merci pour toutes ces réponses ! :D Et pour le lien, on a étudier ça à l'IUT, mais là je ne gère pas une base de données, seulement des tableaux. :) Par contre, ça sera utile pour le futur du projet.

Tant mieux si je peux utiliser les méthodes get() directement même dans une boucle plutôt que de créer des variables à gogo. :wink:

En fait, je suis dans le traitement de pixels là, donc je connais exactement les limites des valeurs (0-255), donc un short. Je pourrais utiliser un byte pour sa taille, mais le problème est la reconversion puisqu'un byte est de -128 à 127.
Et pour le premier parcours du tableau, il calcule à chaque fois le length du coup ?

Et du coup, les boucles for sont surement plus adaptées à ce que je fais puisque je connais exactement la taille des tableaux à parcourir. Mais tu ne réponds pas à cette question : Est-ce sale ? Sale de faire un break dans un for ?
Avatar de l'utilisateur
Thyrion
Expert(e)
Expert(e)
 
Messages: 1253
Inscription: 25 Aoû 2007 19:49
 

Re: Algorithme, mémoire et performance

Message le 19 Avr 2012 23:54

Thyrion a écrit: Est-ce sale ? Sale de faire un break dans un for ?


Moi je l'ai déjà fait, et personne n'en est mort... :oops:
Avatar de l'utilisateur
H3bus
Moderateur
Moderateur
 
Messages: 12195
Inscription: 08 Avr 2008 15:13
Localisation: /home/h3bus
 

Re: Algorithme, mémoire et performance

Message le 20 Avr 2012 00:01

Bon tant mieux, parce que c'est carrément plus pratique là. :lol: Et en plus, les while c'est dangereux à cause des boucles infinies. :P

Merci !
Avatar de l'utilisateur
Thyrion
Expert(e)
Expert(e)
 
Messages: 1253
Inscription: 25 Aoû 2007 19:49
 

Re: Algorithme, mémoire et performance

Message le 29 Avr 2012 22:57

Rebonsoir tout le monde !

Voilà voilà je suis un peu perplexe sur le Java Graphique, notamment les images. Je vous explique :

AWT permet de faire des Panels, Borders, etc. Un peu la base de l'interface graphique.
Swing est mieux que AWT, je sais plus trop en quoi, mais cette partie là je ne m'en occupe pas trop. :)

Or, dans notre projet, je pensais avoir fini (ou presque) la gestion des images, get/set ainsi que du traitement par pixel.
De base, je charge le fichier image en mémoire dans un BufferedImage, pour ensuite avoir une ImageIcon.
Déjà un point : Pour les méthodes paint() (...), il me faut une Image (classe abstraite), et donc je dois faire imageIcon.getImage. Pourquoi ? :o Pourquoi on peut pas utiliser ImageIcon directement ? Est-ce lourd de faire cette "conversion" ?
Mais le problème plus important reste le traitement :
Lorsque je charge le fichier image, je crée donc une ImageIcon, mais aussi à côté un mappage de pixels, tableau à trois dimensions [ X ][ Y ][ COULEUR ].
J'arrive donc à créer une ImageIcon à partir de ce mappage, via un BufferedImage. Mais malheureusement, l'inverse est impossible : Impossible de récupérer chaque couleur de chaque pixel d'une ImageIcon, or ça m'est utile lorsque j'ai besoin de recréer le mappage à partir d'une ImageIcon et ainsi faire du traitement.

J'ai une solution, mais je ne sais pas si c'est propre : Tout le temps utiliser un BufferedImage, même s'il n'y a pas de lecture/écriture dans le disque. C'est le seul moyen de récupérer les pixels d'une image. :-?

Donc en gros : Que me conseillez-vous ?
Je poste ce problème dans ce topic, car c'est avant tout un soucis de performance/gestion des images en Java. :)
Merci d'avance pour vos réponses !
Avatar de l'utilisateur
Thyrion
Expert(e)
Expert(e)
 
Messages: 1253
Inscription: 25 Aoû 2007 19:49
 



Sujets similaires

Message Performance Optimales...
SalutCe post n'est pas une question mais une découverte que je souhaitais partager...J'ai découvert, dans les paramètres du Bios, une option "HPC Mode" (High Performance Computing) qui est désactivée par défaut. Une fois activée, un nouveau mode de gestion de l'alimentation est apparu dans ...
Réponses: 8

Message Mémoire pour carte mère Pegatron Evans 1.02 (Bios 5.07)
Bonjour J'ai un ancien PC sur lequel est installé Windows 10 Pro sur un disque SSD.La carte mère (Pegatron Evans 1.02 Bios 5.07) ne peut accueillir que 2 barrettes de mémoire (chaque barrette installée est une 16JTF25664AZ-1G4F1 Bank0 2 Go), ce qui fait que l'ensemble est peu rapide !Question : pe ...
Réponses: 1

Message mystere de performance
Bonjour mon fiston a changé de pc . Il est passé d'un I5 4460 /GTX 1060 TI / 16 go de ram sous Windows 10 à un Ryzen 5 3600 / RTX 2070 Super / 16 Go de ram sous Windows 10).Sur son nouveau pc lorsqu?il joue à Rocket lige sur Steam en ligne il tourne entre 25 et 60 FPS alors qu'avec son ancien pc il ...
Réponses: 0

Message Conseil sur l'achat de barrettes mémoire vive
Salut heracles Tu pourrais prendre deux kits de 8 Go (2 fois 4) de bonne marque comme celui-ci par exemple :https://www.amazon.fr/G-Skill-M%C3%A9mo ... ref=sr_1_6Bonne soirée. En cas de problème constaté sur un sujet, contactez un modérateur par MP svp. N'intervenez pas vous-même. Merci bien.
Réponses: 4

Message changement barrette de mémoire
Bonjourj'ai un vieux pc dell E6420, j'ai changer les barrette de rame je suis passé de 4go a 6go ( une barrette de 4go et une autre de 2go), le pc fonctionne bienj'ai lu que les mémoire fonctionne en paire , faut il que je remette les 4go d'origine (une barrette2go et une autre 2go) ou je ne risque ...
Réponses: 1

Message Mémoire RAM PC NiPoGi
Bonjour,c'est quoi la fréquence de ta ram, histoire de prendre un modèle DD4 équivalentpour le savoir:-> Clique sur le bouton Démarrer puis tape ?Task Manager? (gestionnaire des tâches).-> Clique sur l?onglet ?Performances? puis sur ?Mémoire?. (au besoin clique sur plus de détails)-> Dans l ...
Réponses: 7

Message memoire pleine
Bonjour,J'ai un soucis avec la mémoire de mon tel j3 2016.Lorsque je connecte le tel sur mon pc je lis: 1,5 Go libre sur 11,2 Go puis Card 28,7 Go libre sur 29,7GoPourtant j'ai déplacé toutes les appli qui le permettais sur la carte, mais lorsque que le tel est sur le pc je ne vois pas les appli qu ...
Réponses: 0


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


.: Nous contacter :: Flux RSS :: Données personnelles :.
cron