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.
Avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
gradb[1] = 2797
gradb[2] = 4338
ns = 3
Mes accesseurs sont de simples READ qui fonctionnent sans probleme sur d'autres boucles.
L'execution suivante du code en C est quasi instantanee :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 READ TABLE im_tabular ASSIGNING <fs_column> WITH TABLE KEY index_j = im_index.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
Partager