✒️ABAP La performance en ABAP
ABAP La performance en ABAP
En ABAP existe lo que en programacion se denomina, buenas y malas practicas ya sea porque afectan a la performance de los programas o porque afectan a otros factores determinantes como son la reutilizacion del codigo. En esta ocasion nos vamos a concentrar en la performance de los programas, cuando hablamos de performance nos estamos refiriendo al analisis del desempeño y rendimiento del programa.
Para ello vamos a trabajar con una transaccion estandar de SAP que es sumamente util para el analisis y la performance, es decir nos estamos refiriendo a la transaccion SE30. Una vez que ingresamos a la transaccion presionamos el boton "Tips and Tricks" aqui vamos a ir analizando las diferentes practicas de programacion ABAP con las que trabajamos a lo largo del modulo de estudios, de modo de poder determinar cuales son buenas y debemos continuar utilizando y cuales no son recomendables y debemos dejar de utilizar.
Empecemos abriendo la carpeta 'Interface SQL' alli clickeamos agregados del SELECT, aqui vemos 2 codigos ABAP que realizan lo mismo de 2 formas diferentes, el objetivo es obtener el maximo valor, el de la izquierda utiliza la sentencia SELECT-ENDSELECT totalmente desaconsejada desde el punto de vista de la performance y el de la derecha utiliza la sentencia SELECT MAX, para evaluar la performance de ambos codigos presionamos el boton "Medir tiempo de la ejecucion" y verificamos lo que mencionamos anteriormente, mientras que con el codigo del SELECT-ENDSELECT el sistema tarda 2739 microsegundos, utilizando el SELECT MAX el sistema solo tarda 177 microsegundos, por lo tanto cuando tengamos que buscar el maximo valor en una tabla siempre utilicemos la opcion de la derecha es decir el SEELCT MAX. Ahora clickeamos seleccion con lista de seleccion, aqui vemos dos codigos ABAP, si bien ambos utilizan la sentencia SELECT-ENDSELECT la cual esta totalmente desaconsejada, el de la izquierda realiza un SELECT *, mientras que el de la derecha especifica los campos a seleccionar, para evaluar su performance presionamos el boton " Medir tiempo de ejecucion". Verificamos que especificar los campos a seleccionar es mucho mas eficiente que realizar un SELECT * donde seleccionamos todos los campos que en muchos casos pueden ser innecesarios, ahora abirmos la carpeta Operaciones de Array(Tablas Internas), aqui seleccionamos Select into table, vemos 2 codigos ABAP, en el de la izquierda se realiza un SELECT-ENDSELECT totalmente desaconsejado y por cada vuelta un APPEND a una tabla interna, en el de la derecha ejecutamos la sentencia SELECT INTO TABLE la cual insertara directamente los registros seleccionados en la tabla interna.
Veamos la performance de ambas, comprobamos que la utilizacion del Select into table es altamente conveniente ya que es practicamente 7 veces mas eficiente desde el punto de vista de la performance, ahora clickeamos 'Array Insert vs. Insert de un solo registro', vemos 2 codigos a la izquierda recorremos la tabla interna TAB_WA y por cada registro realizamos un INSERT, a la derecha evitamos recorrer la tabla interna ejecutando la sentencia INSERT FROM TABLE, veamos la performance de ambas opciones, si bien el resultado arrojado para ambas es 0 microsegundos, la opcion de la derecha es altamente recomendable.
Ahora seleccionamos Array-Select vs. Select-EndSelect, aqui vemos dos opciones, a la izquierda realizamos un SELECT INTO TABLE y luego recorremos la tabla interna con un loop, a la derecha ejecutamos el famoso SELECT-ENDSELECT tan desaconsejado por su mala performance, veamos la performance de ambas sentencias, comprobamos que no es conveniente la utilizacion del SELECT-ENDSELECT, siempre es preferible el SELECT INTO TABLE.
Ahora Abrimos la carpeta de 'Tablas Internas', alli clickeamos 'Usando estructuras explicitas', y vemos 2 codigos, en el de la izquierda se realiza una asignacion y luego un APPEND y en el de la derecha hacemos los 2 pasos en uno solo, veamos la performance de ambos, si bien el resultado es el mismo, es ampliamente recomendable evitar realizar asignaciones innecesarias.
Ahora seleccionamos 'Busqueda lineal vs. Busqueda binaria', vemos por un lado la busqueda lineal que lee cada registro de la tabla interna en forma secuencial hasta encontrar el que cumple con la condicion y por otro lado la busqueda binaria que divide en 2 el espectro de busqueda hasta encontrar el registro buscado, veamos la performance de ambas, el resultado indica que la busqueda binaria es 20 veces mas eficiente que la busqueda lineal, seleccionamos ahora 'acceso por clave a multiples registros' , aqui se presentan 2 alternativas, a la izquierda vemos un loop y dentro del mismo una condicion, a la derecha vemos un loop que tiene incorporado la condicion utilizando la clausula WHERE, veamos la performance de ambas, el resultado indica que es ampliamente recomendable incorporar dentro de los loops las condiciones de busqueda de modo de restringir lo mas posible la cantidad de iteraciones a realizar.
Ahora abrimos la carpeta 'Iteraciones de Array' y seleccionamos la opcion 'Appendeo de tablas', vemos 2 codigos, en el de la izquierda se loopea una tabla interna y se appendea otra, en el de la derecha se realizan ambos pasos en uno solo utilizando la sentencia APPEND LINES OF, veamos la performance de ambas, comprobamos que es ampliamente recomendable la utilizacion de la sentencia APPEND LINES OF, ahora seleccionamos la opcion 'Insercion de tablas', en el codigo de la izquierda se recorre una tabla interna y se inserta cada registro de esta en otra tabla interna, en cambio a la derecha se realizan ambos pasos en uno solo utilizando la sentencia INSERT LINES OF, veamos la performance de ambas opciones, comprobamos que es sumamente recomendable utilizar la sentencia INSERT LINES OF.
Ahora seleccionamos 'Deleting duplicates', aqui se presentan 2 codigos, la principal diferencia entre ambos es que en el de la izquierda se emplea una combinacion de sentencias para borrar los duplicados en la tabla interna, en cambio en el de la derecha solamente se utiliza la sentencia DELETE ADJACENT DUPLICATES, veamos la performance de ambos, comprobamos que es ampliamente recomendable utilizar la sentencia DELETE ADJACENT DUPLICATES para borrar registros duplicados de una tabla interna.
Seleccionamos ahora 'Copying internal tables', aqui se presentan 2 opciones, en la izquierda se loopea una tabla interna y se appendea cada registro en otra tabla interna, en cambio en la derecha se realiza una asignacion directa del contenido de la tabla 1 a la tabla 2, para ello ambas tablas deben ser iguales, veamos la performance de ambas, sin duda la asignacion directa del contenido de una tabla interna a otra del mismo tipo es ampliamente recomendable.
Seleccionemos ahora 'Comparing internal tables', en el codigo de la izquierda se recorren y leen las tablas internas para establecer si son iguales o no, en cambio a la derecha, se emplea la comparacion directa, veamos la performance de ambas, comprobamos que la comparacion directa es totalmente superior en cuestiones de performance.
Seleccionamos ahora 'Ordenamiento de tablas internas' , aqui vamos a comparar la diferencia que existe entre ordenar una tabla interna sin especificar el campo y especificando el campo de ordenamiento, veamos la performance de ambas sentencias, verificamos que es sumamente importante especificar el campo de ordenamiento de una tabla interna, al ejecutar la sentencia SORT.
Ahora abrimos la carpeta 'Typing' y seleccionamos 'Typed vs. untyped Parameters', en la declaracion de la subrutina up1 de la izquierda no se especifican los tipos de los parametros, en cambio en la declaracion de la subrutina up2 de la derecha si se especifican los tipos de los parametros, veamos la performance de ambas, comprobamos que siempre es conveniente especificar los tipos en las declaraciones de subrutinas.
Ahora abrimos la carpeta 'If Case' y seleccionamos 'If vs. Case' vamos a verificar si es mas performante especificar condiciones con if o mediante case, comprobamos que es levemente mas performante utilizar la sentencia CASE para condiciones con muchas opciones.
Ahora abrimos la carpeta 'Field conversions' y seleccionamos 'Mixed Types', aqui se presentan 2 codigos, a la izquierda vamos a multiplicar 2 variables de distintos tipos cuyo resultado almacenaremos en una variable de un tipo distinto a las otras 2, en cambio a la derecha utilizamos 3 variables del mismo tipo, veamos que es mas eficiente en cuestion de performance, resulta mas conveniente trabajar con variables del mismo tipo al realizar operaciones aritmeticas.
Ahora bien algo importante de esta transaccion es que nos permite grabar en archivos los codigos DT que ejecutamos, tambien nos permite testear el codigo que nosotros mismos desarrollemos simplemente escribiendo dicho codigo en la pantalla y presionando el boton de medicion de tiempo.
Por ultimo la transaccion nos permite evaluar como se distribuye el tiempo de procesamiento de un programa ABAP, para ello basta con ingresar el nombre del programa, ejecutarlo y presionar el boton "Evaluar" para finalmente ver los resultados en pantalla
 
 
 
Sobre el autor
Publicación académica de Gerardo Pagaza, en su ámbito de estudios para la Carrera Consultor ABAP.
Gerardo Pagaza
Profesión: Licenciatura en Informatica y Tecnologias de la Informacion - Mexico - Legajo: MH88W
✒️Autor de: 27 Publicaciones Académicas
🎓Egresado del módulo:
Certificación Académica de Gerardo Pagaza