{"id":329,"date":"2019-11-09T13:47:33","date_gmt":"2019-11-09T13:47:33","guid":{"rendered":"http:\/\/ifdesignelseart.com\/?p=329"},"modified":"2019-11-09T13:47:33","modified_gmt":"2019-11-09T13:47:33","slug":"performances-comparees-de-array-et-arraylist","status":"publish","type":"post","link":"https:\/\/ifdesignelseart.com\/?p=329","title":{"rendered":"Performances compar\u00e9es de Array et ArrayList"},"content":{"rendered":"\n<p>Processing permet de manipuler les tableaux avec deux types de variables : les Array (tableaux \u00ab\u00a0normaux\u00a0\u00bb de Processing) et les ArrayList (tableaux Java). Lorsque les tableaux contiennent des variables d&rsquo;un type \u00e9l\u00e9mentaire (int, float), et que la taille du tableau ne change jamais, on a tendance \u00e0 employer les tableaux \u00ab\u00a0normaux\u00a0\u00bb.<br>Lorsque l&rsquo;on recourt \u00e0 des donn\u00e9es plus complexes, comme l&rsquo;objet PVector, ou des classes cr\u00e9\u00e9es par le programmeur, et surtout lorsque l&rsquo;on veut que le tableau puisse voir sa taille changer, on dit souvent qu&rsquo;il vaut mieux utiliser ArrayList. Nous avons d\u00e9cid\u00e9 d&rsquo;\u00e9valuer dans quelle mesure le choix d&rsquo;une ou l&rsquo;autre m\u00e9thode impacte les performances.<br>Voici deux programmes qui permettent d&rsquo;effectuer une comparaison. Ces deux programmes cr\u00e9ent des particules, et remplissent des tableaux qui finissent par contenir plus de 30 000 instances, dont chacune est individuellement appel\u00e9e afin de changer de position et de s&rsquo;afficher.<\/p>\n\n\n\n<p>Voici la version avec un tableau \u00ab\u00a0normal\u00a0\u00bb : <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">poin[] allPoints;<br> int cx,cy, begining;<br><br>void setup(){<br>   begining = millis();<br>   size(640,640);<br>   cx=width\/2;cy=height\/2;<br>   allPoints = new poin[0]; <br> }<br><br>void draw(){<br>   background(255);<br>   int t=millis();<br>  poin[] newAllPoints = new poin[0];  <br>   for(poin p:allPoints){<br>     p.avance();<br>     if(p.alive){<br>       newAllPoints = (poin[]) append(newAllPoints, p); <br>     }<br>   }<br>   float ang=TWO_PI\/frameCount;<br>   for(float a=0;a30000){println(\"total time : \"+(millis()-begining));noLoop();}<br> }<br><br>class poin{<br>   float x,y,a;boolean alive=true;<br>   poin(float x, float y, float a){<br>   this.x=x;this.y=y;this.a=a;<br>   }<br>   void avance(){<br>     if(x&lt;0||y&lt;0||x>width||y>height)alive=false;<br>     x+=cos(a)<em>2;y+=sin(a)<\/em>2;<br>     point(x,y);<br>   }<br> }<\/pre>\n\n\n\n<p>Et voici la version avec ArrayList :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush:java\">ArrayList allPoints;<br> int cx,cy, begining;<br><br>void setup(){<br>   begining = millis();<br>   size(640,640);<br>   cx=width\/2;cy=height\/2;<br>   allPoints = new ArrayList(0); <br> }<br><br>void draw(){<br>   background(255);<br>   int t=millis();<br>   ArrayList newAllPoints=new ArrayList();<br>   for(poin p:allPoints){<br>     p.avance();<br>     if(p.alive){<br>       newAllPoints.add(p);<br>     }<br>   }<br>   float ang=TWO_PI\/frameCount;<br>   for(float a=0;a30000){println(\"total time : \"+(millis()-begining));noLoop();}<br> }<br><br>class poin{<br>   float x,y,a;boolean alive=true;<br>   poin(float x, float y, float a){<br>   this.x=x;this.y=y;this.a=a;<br>   }<br>   void avance(){<br>     if(x&lt;0||y&lt;0||x>width||y>height)alive=false;<br>     x+=cos(a)<em>2;y+=sin(a)<\/em>2;<br>     point(x,y);<br>   }<br> }<\/pre>\n\n\n\n<p>Sur mon ordinateur (mais ce sera diff\u00e9rent sur un ordinateur de puissance diff\u00e9rente), la premi\u00e8re m\u00e9thode est lente puisqu&rsquo;il faut plus de 2000 millisecondes (deux secondes) pour traiter 30162 instances. Avec la seconde m\u00e9thode, le m\u00eame nombre d&rsquo;instances est trait\u00e9 en moins de 400 millisecondes (4\/10e de seconde).<\/p>\n\n\n\n<p>Le tableau ArrayList l&#8217;emporte donc ici haut la main en se montrant plus de cinq fois plus rapide !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Processing permet de manipuler les tableaux avec deux types de variables : les Array (tableaux \u00ab\u00a0normaux\u00a0\u00bb de Processing) et les ArrayList (tableaux Java). Lorsque les tableaux contiennent des variables d&rsquo;un type \u00e9l\u00e9mentaire (int, float), et que la taille du tableau ne change jamais, on a tendance \u00e0 employer les tableaux \u00ab\u00a0normaux\u00a0\u00bb.Lorsque l&rsquo;on recourt \u00e0 des [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-329","post","type-post","status-publish","format-standard","hentry","category-optimisation"],"_links":{"self":[{"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/posts\/329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329"}],"version-history":[{"count":7,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions"}],"predecessor-version":[{"id":336,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions\/336"}],"wp:attachment":[{"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ifdesignelseart.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}