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

Langage Java Discussion :

[optimisation de code] des conseils ?


Sujet :

Langage Java

  1. #1
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut [optimisation de code] des conseils ?
    Bonjour,

    A mon grand damne en cours (cursus bio inbo) on nous a beaucoup dit qu'avoir un code optimisé c'est bien .. mais on nous a jamais expliqué comment lol ...

    donc me voici a fair un joli calcul 600 000 fois ... et ca prend 10 a 20 minutes .. de base je savais que c'était un calcul qui prendrais du temps mais autant essayer d'en prendre le moins possible donc si vous avez des conseil : voici mon code (qui doit pas vraiment etre optimiser) (désolè il est pas commenté .... si vraiment c'est nécéssaire je le ferais lol)

    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
    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
     
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Collections;
     
    import javax.swing.JCheckBox;
    import javax.swing.JPanel;
     
     
    public class AlignementMap extends JPanel{
     
    	ArrayList _mapResults;
    	AlignMapParamSet _param; 
    	MapMain _parent;
    	private static final long serialVersionUID = 49L;
     
    	AlignementMap(AlignMapParamSet param, MapMain parent)
    	{
    		_param = param;
    		_parent = parent;
     
    		MapCalcul();
    	}
     
    	private void MapCalcul()
    	{
    		_mapResults = new ArrayList();
    		int period;
     
    		System.out.println(System.currentTimeMillis());
    		int i = 0 ;
    		while( i< 60)
    		{
    			period = 100;
    			ArrayList distribution = createDistribution(period);
    			_mapResults.add(distibutionResults(distribution, period));
    			i++;
    		}
    		System.out.println(System.currentTimeMillis());
    	}
     
    	private ArrayList createDistribution(int period)
    	{
    		ArrayList genes = _parent.getGeneList();
    		ArrayList distribution = new ArrayList();
    		for (int i = 0; i< genes.size(); i++)
    		{
    			int modulo = ((GenePoint)genes.get(i)).getPosition() % period;
    			distribution.add(modulo/(double)period);	
    		}
     
    		return distribution;
    	}
     
    	private BestAlignementParamSet[] distibutionResults(ArrayList distribution, int period)
    	{
    		double error = 0.01;
    		BestAlignementParamSet[] errorsBA = new BestAlignementParamSet[100];
     
    		for (int i = 0; i<99 ; i++)
    		{
    			score best = BestAlignementfor(distribution, error);
    			ArrayList baArea = new ArrayList();
    			double pValue = pValue(best._score,_parent.getGeneList().size(), error );
    			float phase = (float)(best._position+ error/2);
    			baArea.add(new BAAreaParam(_param.getStart(),_param.getEnd(), (float)error, phase, pValue ));
    			if (phase > 1) phase = phase - 1;
    			errorsBA[i] = new BestAlignementParamSet(period, _param.getStart(), _param.getEnd() ,pValue, false, phase, _param.getStart(), baArea, period+"/"+error);
    			error = error + 0.01;
    		}
     
    		return errorsBA;
    	}
     
    	private score BestAlignementfor(ArrayList distribution, double error)
    	{
    		ArrayList sumList = new ArrayList();
    		ArrayList scoreList = new ArrayList();
    		int sum = 0;
     
    		for (int i = 0 ; i< distribution.size(); i++)
    		{
    			double pos =  (Double)distribution.get(i);
    			sumList.add(new score(pos,-1));
    			sumList.add(new score(pos - error, 1));
    			if (pos <= error)  sum++; // initilization with the gene in the first error window
    		}
    		Collections.sort(sumList);
    		scoreList.add(new score(0, sum));
    		double medPosition;
    		int max = sum;
    		int maxIndice = 0;
    		for (int i = 1 ; i < sumList.size(); i ++)
    		{
    			sum = sum + ((score)sumList.get(i-1))._score;
    			medPosition = ((score)sumList.get(i-1))._position +  (((score)sumList.get(i))._position -  ((score)sumList.get(i-1))._position)/2;
    			scoreList.add(new score(medPosition, sum));
    			if (sum> max)
    			{
    				max = sum;
    				maxIndice = i;
    			}
    		}
    		sum = sum + ((score)sumList.get( sumList.size()-1))._score;
    		medPosition = ((score)sumList.get( sumList.size()-1))._position +  (1 -  ((score)sumList.get( sumList.size()-1))._position)/2;
    		scoreList.add(new score(medPosition, sum));
    		if (sum> max)
    		{
    			max = sum;
    			maxIndice =  sumList.size();
    		}
     
    		return	(score)scoreList.get(maxIndice);
    	}
     
    	private double pValue(int nbGenes, int nbGenesIn, double error)
    	{
    	double logPVal = 0;
     
    	double sum = 0;
    	for (int i = 1 ; i<= nbGenes; i++)
    	{
    		sum = sum + i;
    	}
    	logPVal = sum;
     
    	sum = 0;
    	for (int i = 1 ; i<= nbGenesIn; i++)
    	{
    		sum = sum + i;
    	}
    	logPVal = logPVal - sum;
     
    	sum = 0;
    	for (int i = 1 ; i<= (nbGenes - nbGenesIn); i++)
    	{
    		sum = sum + i;
    	}
    	logPVal = logPVal - sum;
     
    	logPVal = logPVal+nbGenesIn* Math.log(error) + (nbGenes - nbGenesIn) * Math.log(1 - error);
    	return Math.exp(logPVal);
    	}
     
     
    	private class score implements Comparable
    	{
    		double _position;
    		int _score;
    		score(double position, int score)
    		{
    			if (position < 0) position = 1 + position;
    			_position = position;
    			_score = score;
    		}
     
    		public int compareTo(Object o) {
    			return( Double.compare(_position, ((score)o)._position));
    		}
    	}
    }

    je prend tout conseils, site web bien fait ect ...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    il y a déjà ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sum = 0;
    	for (int i = 1 ; i<= nbGenesIn; i++)
    	{
    		sum = sum + i;
    	}
    mieux vaut :

    sum = nbGenesIn*(nbGenesIn+1)/2 ....

    math power

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par LittleBean
    il y a déjà ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sum = 0;
    	for (int i = 1 ; i<= nbGenesIn; i++)
    	{
    		sum = sum + i;
    	}
    mieux vaut :

    sum = nbGenesIn*(nbGenesIn+1)/2 ....

    math power

    merci .. je savais bien que c'était un suite mais .. j'ai jamais réussi à retenir les formules lol ....

  4. #4
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Pour celle-là c'est très simple à retrouver :
    S = 1 + 2 ... n-1 + n
    S = n + n-1 ... 2 + 1

    donc en faisant la somme des deux :

    2S = (1+n) + (2+n-1) +... + (n-1+2) + (n+1)
    2S = (n+1) + (n+1) + ...

    2S = n*(n+1)

  5. #5
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par remika
    Pour celle-là c'est très simple à retrouver :
    ^^ .. lol j'ai tapé ce code tôt ce matin j'ai le droit aux circonstances atténuantes ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	logPVal = logPVal+nbGenesIn* Math.log(error) + (nbGenes - nbGenesIn) * Math.log(1 - error);
    	return Math.exp(logPVal);
    tu dois pouvoir éliminer les log dans cette formule
    ce n est pas terrible de faire log puis exp
    ça devrait améliorer le temps et la précision de ton programme
    bonne chance pour la formule

  7. #7
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    disons que sa fera plusieur puissance eu lieu d'une grosse exponentiel car a^x = exp (x*ln(a)) si je ne m'abuse... et exp(x+y) = exp(x)*exp(y)

    Sinon tu peux aussi faire du profling de ton code pour voir a quel nivo le CPU est consommé et ou tu peu gagner du temps avec le plugin eclipse TPTP qui fonctionne tres bien pour sa

    ++

  8. #8
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par guis14
    disons que sa fera plusieur puissance eu lieu d'une grosse exponentiel car a^x = exp (x*ln(a)) si je ne m'abuse... et exp(x+y) = exp(x)*exp(y)

    Sinon tu peux aussi faire du profling de ton code pour voir a quel nivo le CPU est consommé et ou tu peu gagner du temps avec le plugin eclipse TPTP qui fonctionne tres bien pour sa

    ++

    oki merci ^^

    et pour le log .. je ne pense pas que ca marche sans ... car 169! (factoriel) j'ai des doutes sur la mémoire lol

Discussions similaires

  1. Des techniques d'optimisation du code
    Par Art19 dans le forum Langage
    Réponses: 10
    Dernier message: 27/07/2007, 16h51
  2. [PHP-JS] Optimisation du code avec des boucles
    Par jiojioforever dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2007, 16h02
  3. Optimisation de code - demande de conseils
    Par ploukinet dans le forum MATLAB
    Réponses: 11
    Dernier message: 14/06/2007, 12h58
  4. Réponses: 8
    Dernier message: 14/09/2006, 16h43
  5. Optimisation du code des ordres SQL
    Par Titouf dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/08/2005, 22h08

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