Arraymatrix -matrice multidimensionelle et générique- , implementation , test de perfomance et test de l'unité

Description

Approche répondant à la source de Julien39 sur l'alternative sur des Array's d'object.

Méthodes:
- Ajouter un élément de type T
- lire un élément de type T

Test de performance:
- cette classe est testée contre un tableau multidimensionnel classique: voir resultat ci-dessous

la classe ci-dessous est la classe de Test. l'implementation de ArrayMatrix est dans le zip

Source / Exemple :


package crx.lbs.math;

import junit.framework.Assert;

import org.junit.Test;

/**

  • @author Labandus
  • /
public class MockingArrayMatrix { /**
  • functionTest of this Unit methods like put(), get() , inbound are tested
  • /
@Test public void _functionTestArrayMatrix() { ArrayMatrix<String> arrayMatrix = new ArrayMatrix<String>(new int[] { 2, 3, 4 }); // checking if the coordinates are inbound ([1,2,4] --> only the last // coordinate 4 is out of the bound) Assert.assertFalse(arrayMatrix.isInBound(new int[] { 1, 2, -3 })); // inserting in the bound and retrieving in the bound arrayMatrix.putElement(new int[] { 0, 1, 3 }, "Hallo"); Assert.assertTrue("Hallo".equals(arrayMatrix.getElement(new int[] { 0, 1, 3 }))); // inserting out of bound and retrieving out of bound arrayMatrix.putElement(new int[] { 0, 1, 4 }, "Hallo"); Assert.assertFalse("Hallo".equals(arrayMatrix.getElement(new int[] { 0, 1, 4 }))); } /**
  • checking the performance of the ArrayMatrix against a "classic" Array
  • /
@Test public void _perfomanceTestArrayMatrix() { short dim_x = 5; short dim_y = 7; short dim_z = 10; long arrayStartTime = 0; // start Time for the "classic" Array; long arrayEndTime = 0; // end Time for the "classic" Array; long arrayMatrixStartTime = 0; // start Time for the ArrayMatrix; long arrayMatrixEndTime = 0; // end Time for the ArrayMatrix; // ----- Initialization of the classic Array---- arrayStartTime = System.currentTimeMillis(); String[][][] arrayString = new String[dim_x][dim_y][dim_z]; for (int i = 0; i < dim_x; i++) for (int j = 0; j < dim_y; j++) for (int k = 0; k < dim_z; k++) arrayString[i][j][k] = "String (" + i + " " + j + " " + k + ")"; arrayEndTime = System.currentTimeMillis(); System.out.println(" classic Array elapsed time for initialization: " + (arrayEndTime - arrayStartTime) + " ms"); // ----- Initialization of the ArrayMatrix---- arrayMatrixStartTime = System.currentTimeMillis(); ArrayMatrix<String> arrayMatrix = new ArrayMatrix<String>(new int[] { dim_x, dim_y, dim_z }); for (short i = 0; i < dim_x; i++) for (short j = 0; j < dim_y; j++) for (short k = 0; k < dim_z; k++) arrayMatrix.putElement(new int[] { i, j, k }, "String (" + i + " " + j + " " + k + ")"); arrayMatrixEndTime = System.currentTimeMillis(); System.out.println(" ArrayMatrix elapsed time for initialization: " + (arrayMatrixEndTime - arrayMatrixStartTime) + " ms"); // ----- Reading of the classic Array---- arrayStartTime = System.currentTimeMillis(); for (int i = 0; i < dim_x; i++) for (int j = 0; j < dim_y; j++) for (int k = 0; k < dim_z; k++) System.out.println(arrayString[i][j][k]); arrayEndTime = System.currentTimeMillis(); System.out.println("elapsed time for reading: " + (arrayEndTime - arrayStartTime) + " ms"); // ----- Reading of the ArrayMatrix---- arrayMatrixStartTime = System.currentTimeMillis(); for (short i = 0; i < dim_x; i++) for (short j = 0; j < dim_y; j++) for (short k = 0; k < dim_z; k++) System.out.println(arrayMatrix.getElement(i, j, k)); arrayMatrixEndTime = System.currentTimeMillis(); System.out.println("ArrayMatrix elapsed time for reading: " + (arrayMatrixEndTime - arrayMatrixStartTime) + " ms"); } }

Conclusion :


après mes test j'ai juste trouvé la classe moins rapide (qq ms en plus sur le normal) aussi bien dans l'initialisation( worst case: 4ms de plus ) que dans la lecture des données( worst case: 1,6 de plus que le classic).. mais plus SURE dans le design et la maintenance du code dans un projet:

En effet cette classe, contrairement à l'array nous permettra d'ajouter des nouvelles fonctionalité pour de multiples classes graces à la généricité.

Design VS rapidité ? on choisit quoi ?
merci pour vos commentaires pour améliorer la rapidité d'exécution des méthodes... je crois qu'avec une bonne approche, on peut égaler l'array classique.

la lenteur vient du fait de gérer l'aspect multidimensionnel manuellement (vérifier la validité des coordonnées, ajouter , etc).

Neamoins c fut une bon exo sur la conception et le design des classes.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.