Realizando pruebas para ver si es viable el uso de la recursividad en SAP. Me encuentro con el siguiente resultado que os mostraré a continuación.
Para realizar la prueba ejecuto el siguiente programa muy sencillo y creo que fácilmente comprensible. Bien según mis experiencias anteriores sobre la ejecución de métodos recursivos frente a los que no lo son, me dice la experiencia que la recursividad gana en la mayoría de los casos. Y claro dentro de la burbuja del mundo SAP, yo creía que un sistema donde se ejecuta en máquinas "BRUTALES" la recursividad sería perfecto para no derrochar recursos. Así que comienzo a ejecutar lo siguiente:
DATA: lv_total TYPE i VALUE 0,
lv_aux TYPE i,
lv_inicio TYPE i,
lv_fin TYPE i,
operador TYPE i VALUE 1000.
PARAMETER lp_suma TYPE i DEFAULT 9999.
START-OF-SELECTION.
lv_aux = lp_suma. "Almacenamos el valor
GET RUN TIME FIELD lv_inicio.
* Metodo con secursividad --------------------------------------------------------
PERFORM suma USING lp_suma lv_total.
* -------------------------------------------------------------------------------
GET RUN TIME FIELD lv_fin.
lv_fin = ( lv_fin - lv_inicio ) / operador.
WRITE: / '(RECURSIVO) tiempo de respuesta: ', lv_fin , ' milisegundos'.
* ---------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------
WRITE: /.
WRITE: /.
* ---------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------
lp_suma = lv_aux. "cargamos su valor
lv_aux = lv_fin.
lv_total = 0.
GET RUN TIME FIELD lv_inicio.
* Metodo sin secursividad --------------------------------------------------------
WHILE lp_suma > 0.
lv_total = lv_total + lp_suma.
lp_suma = lp_suma - 1.
ENDWHILE.
WRITE: 'resultado ', lv_total.
* --------------------------------------------------------------------------------
GET RUN TIME FIELD lv_fin.
lv_fin = ( lv_fin - lv_inicio ) / operador.
WRITE: / '(NO RECURSIVO) tiempo de respuesta: ', lv_fin , ' milisegundos'.
WRITE: /.
WRITE: /.
IF lv_aux < lv_fin.
WRITE: / 'La recursividad es la mejor solución'.
ELSEIF lv_aux = lv_fin.
WRITE: / 'EMPATE!!!!'.
ELSE.
WRITE: / 'El while es la mejor solución'.
ENDIF.
FORM suma USING lv_suma TYPE i
lv_total TYPE i.
IF lv_suma GT 0.
lv_total = lv_total + lv_suma.
lv_suma = lv_suma - 1.
PERFORM suma USING lv_suma lv_total.
ELSE.
WRITE: 'resultado ', lv_total.
ENDIF.
ENDFORM.
El programa ejecuta inicialmente una función recursiva y seguido ejecuta el mismo proceso sin aplicar recursividad. Finalmente en la pantalla muestra el resultado de la operación junto con los milisegundos que ha durado ambas. Y para mi sorpresa me encuentro lo siguiente:
resultado 49.995.000 (RECURSIVO) tiempo de respuesta: 49 milisegundos resultado 49.995.000 (NO RECURSIVO) tiempo de respuesta: 24 milisegundos El while es la mejor soluciónBueno para mi desgracia la recursividad no es una solución.