2016-10-17 2 views
0

Je les documents suivants:Performance: Comparer les enregistrements d'un tableau de tranches?

type Items is 
    record 
     Feature_A : Type_Feature_A; 
     Feature_B : Type_Feature_B; 
     Feature_C : Type_Feature_C; 
     Feature_D : Type_Feature_D; 
    end record; 

type My_Array is array (1 .. 10) of Items; 

type My_Record is 
    record 
     Count : Integer; 
     Item_Arr : My_Array; 
    end record; 

avec lesquels je travaillais le type My_Record, par exemple, je CONSERVE 8 éléments dans le tableau et je veux extraire les articles 2 par 2.

Pour ce faire, je ont déclaré une fonction qui copie les 2 premiers éléments du tableau à un sous-type de my_array et décrément « Count » par 2. Puis je tartine « Item_Arr »:

Item_Arr(1..8) := Item_Arr(3..10); 
Item_Arr(9..10) := Default_Value; 

Ma question est: est-ce la bonne façon de fais ça? Ou il vaudra mieux faire une boucle sur les éléments et chaque fois que j'ai trouvé un élément différent de la 'Default_Value' je l'ai ajouté au tableau de sortie et ainsi de suite.

En termes de performances, la comparaison des enregistrements est plus rapide que la découpe d'une matrice?

Merci

+0

Il est préférable d'utiliser une tranche de matrice variable en faisant varier les indices et en laissant les données en place plutôt que de copier l'ensemble de la matrice. –

Répondre

1

Comme toujours lorsque la question est la performance, la réponse est "mesure, mesure, mesure". Étant donné qu'Ada a été conçu en tenant compte des performances, je considère qu'il est préférable d'utiliser l'implémentation la plus lisible que je puisse imaginer comme implémentation de référence pour les mesures de performance.

Dans le cas concret, je dirais que votre suggestion est probablement l'implémentation la plus lisible. Pour les performances, une alternative consiste à avoir une file d'attente circulaire, de sorte que vous ne déplaciez pas les éléments, mais que vous gardiez à la fois la tête et la queue de la file d'attente.