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.