Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > ERP > SAP
SAP Forum d'entraide sur SAP et sur la programmation avec le langage ABAP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/07/2007, 19h58   #1
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Par défaut [ABAP] Calcul Matriciel et Pb de Performances

Bonsoir a tous,
Je sollicite votre aide concernant un probleme de performance sur la partie suivante d'un programme. Il s'agit d'une multiplication polynomiale sur de grandes tables internes mais avant de songer a une quelconque optimisation, je me demande si ma boucle est correcte. Merci par avance.

L.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  l_idx_k = 0.
  DO m_ns TIMES.
    IF l_idx_k GT 0.
      l_idx_j = 0.
      CLEAR l_i_dummy.
      l_i_dummy = get_int_tabular( im_index = l_idx_k im_tabular = mt_gradb ).
      DO l_i_dummy + 1 TIMES.
        l_idx_i = 0.
        l_sum = 0.

        DO l_idx_j + 1 TIMES.
          CLEAR: l_i_dummz, l_i_dummx.
          l_i_dummz = get_int_tabular( im_index = l_idx_k - 1 im_tabular = mt_gradb ).
          l_i_dummx = l_idx_j - get_int_tabular( im_index = l_idx_k im_tabular = mt_graddd ).
          IF l_idx_i LE l_i_dummz AND
             l_idx_i GE l_i_dummx.

            CLEAR l_f_dummy.
            l_f_dummy = get_float_matrix( im_index_i = l_idx_j - l_idx_i im_index_j = l_idx_k im_matrix = mt_dd ).
            l_f_dummy = get_float_matrix( im_index_i = l_idx_i im_index_j = l_idx_k - 1 im_matrix = mt_bb ) * l_f_dummy.
            l_sum = l_sum + l_f_dummy.
          ENDIF.
          l_idx_i = l_idx_i + 1.
        ENDDO.
        CALL METHOD set_float_matrix
          EXPORTING
            im_index_i   = l_idx_j
            im_index_j   = l_idx_k
            im_new_value = l_sum
          CHANGING
            ch_matrix    = mt_bb.
        l_idx_j = l_idx_j + 1.
      ENDDO.
    ENDIF.
    l_idx_k = l_idx_k + 1.
  ENDDO.
Avec :
gradb[1] = 2797
gradb[2] = 4338
ns = 3

Mes accesseurs sont de simples READ qui fonctionnent sans probleme sur d'autres boucles.

Code :
1
2
READ TABLE im_tabular ASSIGNING <fs_column> WITH TABLE KEY index_j = im_index.
L'execution suivante du code en C est quasi instantanee :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double summe;
	int mm;
	for(k = 1; k < ns; k++)
	{
		for(mm = 0; mm <= gradb[k]; mm = mm + 1)
		{
			summe = 0;
			for(i = 0; i <= mm; i++)
			{
				if(i <= gradb[k-1] && i >= mm - graddd[k])
				{
					summe = summe + bb[i][k-1] * dd[mm-i][k];
				}
			}
			bb[mm][k] = summe;
		}		
	}
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 14h03   #2
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
La multiplication passe de quelques dizaines de minutes à 5 minutes en utilisant des Hash Tables. J'aurai dû y penser avant mais quoiqu'il en soit, ce n'est toujours pas acceptable.

L.
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h21.


 
 
 
 
Partenaires

Hébergement Web