Dans fabricArray fous juste "new ArrayList(n)" et ça ira beaucoup mieux
Java 
Le 06 janvier 2018 à 19:24:08 JeanCroutenard a écrit :
Dans fabricArray fous juste "new ArrayList(n)" et ça ira beaucoup mieux
Mais je comprends pas, ce que tu veux me dire c'est que ça :
System.out.println(new ArrayList<Integer>(5));Doit donner ça :
[0,1,2,3,4]
Mais ça marche pas, ça me fait un tableau vide [ ]. Du coup j'imagine que c'est pas comme ça qu'on construit une ArrayList d'entiers consécutifs 
déja fait un
new ArrayList<>(n);
pasque la à chaque fois que t'insére un élement il est obligé de réallouer un Integer, normal que de base ce soit plus rapide
Le 06 janvier 2018 à 19:32:37 foxysexuel13 a écrit :
déja fait un
new ArrayList<>(n);pasque la à chaque fois que t'insére un élement il est obligé de réallouer un Integer, normal que de base ce soit plus rapide
J'ai testé, c'est encore pire qu'avant. Cette nouvelle méthode de construction met 1 seconde de plus 
Mais non, tu gardes ton code mais tu remplaces ArrayList() par ArrayList(n).
C'est pour lui dire d'allouer directement la place nécessaire pour n entiers.
Le 06 janvier 2018 à 19:34:45 JeanCroutenard a écrit :
Mais non, tu gardes ton code mais tu remplaces ArrayList() par ArrayList(n).
C'est pour lui dire d'allouer directement la place nécessaire pour n entiers.
Oui c'est ce que j'ai fait
public static ArrayList<Integer> fabricArray(int n){
ArrayList<Integer> list = new ArrayList<>(n);
for(int i=1;i<=n;i++)
list.add(i);
return list;
}Mais c'est pire qu'avant. On est passé de 2.7 secondes pour calculer la somme à 3.384 
En tout cas la somme donne la même chose pour les deux méthodes, c'est juste la construction de l'ArrayList qui diffère, déjà ça j'avais même pas remarqué 
Du coup là je suis bloqué et j'ai l'impression que vous aussi 
En fait c'est juste les int vs Integer qui explique la différence de performance ici :
public static Integer[] fabricTab(int n) {
Integer[] tab = new Integer[n];
for(int i=0;i<n;i++)
tab[i]=i+1;
return tab;
}Ce truc met 2 sec aussi
Par contre moi j'ai 2.3 sec pour le tab et 1 sec pour ArrayList et je vois pas trop l'explication, ArrayList est censé faire la même chose que le tab + quelques conneries en plus 
Le 06 janvier 2018 à 19:55:51 JeanCroutenard a écrit :
Par contre moi j'ai 2.3 sec pour le tab et 1 sec pour ArrayList et je vois pas trop l'explication, ArrayList est censé faire la même chose que le tab + quelques conneries en plus
ça c'est en changeant la méthode fabricTab avec tes integer ? 
En prenant mon programme du début dans mon pastebin, t'as quoi comme résultats ? 
Avec ton truc du début j'ai 0.03 et 1.5 grosso modo
Si je change l'ordre des deux bordels j'ai toujours 2.3s pour le premier et 1s pour le second, indépendamment duquel est tab et arraylist
Bref c'est une optimisation du compilo à la noix je pense
Ou il lui faut un peu de temps pour se chauffer après il est deter 
Le 06 janvier 2018 à 20:00:47 JeanCroutenard a écrit :
Avec ton truc du début j'ai 0.03 et 1.5 grosso modo
C'est vraiment bizarre, j'ai la même chose que toi pour les tableaux mais par contre j'ai 1 seconde de plus pour les ArrayList.
C'est Eclipse ton IDE ? 
Le 06 janvier 2018 à 20:05:03 Capitainerie a écrit :
Le 06 janvier 2018 à 20:00:47 JeanCroutenard a écrit :
Avec ton truc du début j'ai 0.03 et 1.5 grosso modoC'est vraiment bizarre, j'ai la même chose que toi pour les tableaux mais par contre j'ai 1 seconde de plus pour les ArrayList.
C'est Eclipse ton IDE ?
Non mais c'est normal que ça soit pas exactement pareil on a pas le même pc. L'important c'est pas le temps en seconde c'est l'ordre de grandeur.
Le 06 janvier 2018 à 20:04:02 JeanCroutenard a écrit :
Si je change l'ordre des deux bordels j'ai toujours 2.3s pour le premier et 1s pour le second, indépendamment duquel est tab et arraylist
Bref c'est une optimisation du compilo à la noix je penseOu il lui faut un peu de temps pour se chauffer après il est deter
Moi en changeant les deux bordels j'ai toujours la même chose, mon ArrayList me donne 2.3 secondes et 0.03 pour les tableaux, il est chaud mon eclipse
Le 06 janvier 2018 à 20:06:48 JeanCroutenard a écrit :
Le 06 janvier 2018 à 20:05:03 Capitainerie a écrit :
Le 06 janvier 2018 à 20:00:47 JeanCroutenard a écrit :
Avec ton truc du début j'ai 0.03 et 1.5 grosso modoC'est vraiment bizarre, j'ai la même chose que toi pour les tableaux mais par contre j'ai 1 seconde de plus pour les ArrayList.
C'est Eclipse ton IDE ?
Non mais c'est normal que ça soit pas exactement pareil on a pas le même pc. L'important c'est pas le temps en seconde c'est l'ordre de grandeur.
Non mais je comprends bien. Le truc que je souligne c'est qu'on a le même temps pour les tab et que j'ai 1 seconde de plus pour les ArrayList. 
Le 06 janvier 2018 à 20:08:35 Capitainerie a écrit :
Le 06 janvier 2018 à 20:04:02 JeanCroutenard a écrit :
Si je change l'ordre des deux bordels j'ai toujours 2.3s pour le premier et 1s pour le second, indépendamment duquel est tab et arraylist
Bref c'est une optimisation du compilo à la noix je penseOu il lui faut un peu de temps pour se chauffer après il est deter
Moi en changeant les deux bordels j'ai toujours la même chose, mon ArrayList me donne 2.3 secondes et 0.03 pour les tableaux, il est chaud mon eclipse
![]()
Oui ça c'est normal, les int sont plus rapides que les Integer. Ce que je disais c'est dans le cas où on met des Integer partout.
Putain mon eclipse vient de planter, je crois que le garbage collector pète un cable avec tous mes tests. Aussi faut savoir que mon ordi est fini à la pisse 
Bref pour résumer :
- int et Integer c'est quasiment la même chose, sauf qu'effectivement si tu dois allouer 10 millions de petites cases pour y stocker un entier au lieu de directement manipuler tes 10 millions d'entiers, bah ça commence à se faire sentir. Ça pose rarement problème pas besoin de se limiter sur l'utilisation de Integer pour autant.
- L'important à connaître, c'est tableaux vs listes. Le but des tableaux, c'est que l'opération tab[i] soit instantanée. Alors que sur une liste, faire list.get(i) est la plupart du temps une mauvaise idée : list.get(i) va traverser toute la liste jusqu'à arriver au i-ème élément. Par contre sur une liste tu peux faire un .add de manière instantanée, ce qui n'existe pas sur les tableaux.
- ArrayList est un truc un peu hybride, mais dans le fond ça reste avant tout un tableau. Les méthodes de listes comme "add" y ont été ajoutées, mais sont parfois moins efficaces que sur les vraies listes. La méthode .get(i) est instantanée, comme sur les tableaux. Le add est parfois instantané, et parfois il doit recopier tout le tableau.
- Faire des tests en mesurant le temps que prennent les opérations, c'est rigolo mais rarement pertinent, on va mesurer beaucoup de bruit style optimisations du compilo, des conneries comme int / Integer, etc. Il faut surtout avoir quelques notions d'algo et de complexité. On s'en fout que telle méthode aille 2 fois plus vite que telle autre, tant que c'est juste un facteur constant. Par contre si une méthode est en O(n) et l'autre en O(n²), là ça fait une grosse différence. Les soucis de performances sont presque toujours des problèmes de complexité, à part si tu fais des trucs très bas niveau.