CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[JAVA] ArrayList vs Tableau, match à mort !

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 19:24:08

Dans fabricArray fous juste "new ArrayList(n)" et ça ira beaucoup mieux

T0RGUE
T0RGUE
Niveau 9
06 janvier 2018 à 19:26:03

Java https://image.noelshack.com/fichiers/2016/31/1470170706-1469971038-risitas258.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:31:04

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 https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Message édité le 06 janvier 2018 à 19:32:07 par Capitainerie
foxysexuel13
foxysexuel13
Niveau 2
06 janvier 2018 à 19:32:37

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

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:34:30

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 https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 19:34:45

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.

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:35:48

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 https://image.noelshack.com/fichiers/2017/39/3/1506524542-ruth-perplexev2.png

Message édité le 06 janvier 2018 à 19:38:49 par Capitainerie
Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:37:32

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é https://image.noelshack.com/fichiers/2016/47/1480064732-1467335935-jesus4.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:50:35

Du coup là je suis bloqué et j'ai l'impression que vous aussi https://image.noelshack.com/fichiers/2017/10/1489162412-1465686632-jesuus-risitas.gif

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 19:53:12

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

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 19:55:51

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 https://image.noelshack.com/fichiers/2017/11/1489360476-risitas-toilet.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 19:57:50

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 https://image.noelshack.com/fichiers/2017/11/1489360476-risitas-toilet.png

ça c'est en changeant la méthode fabricTab avec tes integer ? https://image.noelshack.com/fichiers/2017/11/1489360476-risitas-toilet.png

En prenant mon programme du début dans mon pastebin, t'as quoi comme résultats ? https://image.noelshack.com/fichiers/2016/36/1473263957-risitas33.png

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 20:00:47

Avec ton truc du début j'ai 0.03 et 1.5 grosso modo

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 20:04:02

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 :noel: Ou il lui faut un peu de temps pour se chauffer après il est deter https://image.noelshack.com/fichiers/2016/46/1479343542-risitasgomuscu2.png

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 20:05:03

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 ? https://image.noelshack.com/fichiers/2016/47/1480064732-1467335935-jesus4.png

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 20:06:48

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 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 ? https://image.noelshack.com/fichiers/2016/47/1480064732-1467335935-jesus4.png

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.

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 20:08:35

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 pense :noel: Ou il lui faut un peu de temps pour se chauffer après il est deter https://image.noelshack.com/fichiers/2016/46/1479343542-risitasgomuscu2.png

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 https://image.noelshack.com/fichiers/2016/48/1480629790-04.jpg

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 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 ? https://image.noelshack.com/fichiers/2016/47/1480064732-1467335935-jesus4.png

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. https://image.noelshack.com/fichiers/2017/10/1489162412-1465686632-jesuus-risitas.gif

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 20:16:39

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 pense :noel: Ou il lui faut un peu de temps pour se chauffer après il est deter https://image.noelshack.com/fichiers/2016/46/1479343542-risitasgomuscu2.png

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 https://image.noelshack.com/fichiers/2016/48/1480629790-04.jpg

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.

Capitainerie
Capitainerie
Niveau 6
06 janvier 2018 à 20:24:14

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 https://image.noelshack.com/fichiers/2017/01/1483619930-risitasblc26zfz.png

JeanCroutenard
JeanCroutenard
Niveau 10
06 janvier 2018 à 20:26:28

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.

Message édité le 06 janvier 2018 à 20:28:37 par JeanCroutenard
Sous forums
  • Religion
La vidéo du moment