En informática , la algorítmica empírica (o algorítmica experimental ) es la práctica de utilizar métodos empíricos para estudiar el comportamiento de los algoritmos . La práctica combina el desarrollo de algoritmos y la experimentación: los algoritmos no solo se diseñan, sino que también se implementan y se prueban en una variedad de situaciones. En este proceso, se analiza un diseño inicial de un algoritmo para que el algoritmo pueda desarrollarse de manera gradual. [1]
Descripción general
Los métodos de la algorítmica empírica complementan los métodos teóricos para el análisis de algoritmos . [2] A través de la aplicación basada en principios de métodos empíricos, particularmente de la estadística , a menudo es posible obtener información sobre el comportamiento de algoritmos como algoritmos heurísticos de alto rendimiento para problemas combinatorios difíciles que son (actualmente) inaccesibles al análisis teórico. [3] Los métodos empíricos también se pueden utilizar para lograr mejoras sustanciales en la eficiencia algorítmica . [4]
La científica informática estadounidense Catherine McGeoch identifica dos ramas principales de la algorítmica empírica: la primera (conocida como análisis empírico ) se ocupa del análisis y la caracterización del comportamiento de los algoritmos , y la segunda (conocida como diseño de algoritmos o ingeniería de algoritmos ) se centra en los métodos empíricos para mejorar el rendimiento de los algoritmos . [5] La primera a menudo se basa en técnicas y herramientas de la estadística , mientras que la segunda se basa en enfoques de la estadística , el aprendizaje automático y la optimización . Las herramientas de análisis dinámico , típicamente los perfiladores de rendimiento , se utilizan comúnmente cuando se aplican métodos empíricos para la selección y el refinamiento de algoritmos de varios tipos para su uso en varios contextos. [6] [7] [8]
Las investigaciones sobre algoritmos empíricos se publican en varias revistas, entre ellas, ACM Journal on Experimental Algorithmics (JEA) y Journal of Artificial Intelligence Research (JAIR). Además de Catherine McGeoch, entre los investigadores más conocidos en algoritmos empíricos se incluyen Bernard Moret , Giuseppe F. Italiano , Holger H. Hoos , David S. Johnson y Roberto Battiti . [9]
Perfiles de rendimiento en el diseño de algoritmos complejos
En ausencia de algoritmos empíricos, el análisis de la complejidad de un algoritmo puede implicar varios métodos teóricos aplicables a varias situaciones en las que se puede utilizar el algoritmo. [10] Las consideraciones sobre la memoria y la memoria caché suelen ser factores importantes a tener en cuenta en la elección teórica de un algoritmo complejo, o el enfoque para su optimización, para un propósito determinado. [11] [12] La elaboración de perfiles de rendimiento es una técnica de análisis de programas dinámicos que se utiliza normalmente para encontrar y analizar cuellos de botella en el código de una aplicación completa [13] [14] [15] o para analizar una aplicación completa para identificar código de bajo rendimiento. [16] Un generador de perfiles puede revelar el código más relevante para los problemas de rendimiento de una aplicación. [17]
Un generador de perfiles puede ayudar a determinar cuándo elegir un algoritmo sobre otro en una situación particular. [18] Cuando se crea un perfil de un algoritmo individual, como en el análisis de complejidad, las consideraciones sobre la memoria y la caché suelen ser más importantes que los recuentos de instrucciones o los ciclos de reloj; sin embargo, los hallazgos del generador de perfiles se pueden considerar a la luz de cómo el algoritmo accede a los datos en lugar de la cantidad de instrucciones que utiliza. [19]
La elaboración de perfiles puede proporcionar una visión intuitiva del comportamiento de un algoritmo [20] al revelar los hallazgos de rendimiento como una representación visual. [21] La elaboración de perfiles de rendimiento se ha aplicado, por ejemplo, durante el desarrollo de algoritmos para hacer coincidir comodines . Los primeros algoritmos para hacer coincidir comodines, como el algoritmo wildmat de Rich Salz , [22] generalmente se basaban en la recursión , una técnica criticada por motivos de rendimiento. [23] El algoritmo de comodines de coincidencia de Krauss se desarrolló en base a un intento de formular una alternativa no recursiva utilizando casos de prueba [24] seguido de optimizaciones sugeridas a través de la elaboración de perfiles de rendimiento, [25] lo que resultó en una nueva estrategia algorítmica concebida a la luz de la elaboración de perfiles junto con otras consideraciones. [26] Los perfiladores que recopilan datos a nivel de bloques básicos [27] o que dependen de la asistencia de hardware [28] brindan resultados que pueden ser lo suficientemente precisos para ayudar a los desarrolladores de software a optimizar algoritmos para una computadora o situación en particular. [29] La elaboración de perfiles de rendimiento puede ayudar a los desarrolladores a comprender las características de los algoritmos complejos aplicados en situaciones complejas, como los algoritmos coevolutivos aplicados a problemas arbitrarios basados en pruebas, y puede ayudar a generar mejoras en el diseño. [30]
Véase también
- Ingeniería de algoritmos
- Análisis de algoritmos
- Elaboración de perfiles (programación informática)
- Ajuste del rendimiento
- Desarrollo de software
Referencias
- ^ Fleischer, Rudolf; et al., eds. (2002). Algoritmia experimental: del diseño de algoritmos al software robusto y eficiente. Springer International Publishing AG.
- ^ Moret, Bernard ME (1999). Hacia una disciplina de algorítmica experimental . Serie DIMACS en matemáticas discretas y ciencias de la computación teóricas. Vol. 59. Serie DIMACS en matemáticas discretas y ciencias de la computación teóricas. págs. 197–213. doi :10.1090/dimacs/059/10. ISBN 9780821828922. Número de identificación del sujeto 2221596.
- ^ Hromkovic, Juraj (2004). Algoritmia para problemas difíciles. Springer International Publishing AG.
- ^ Guzmán, John Paul; Limoanco, Teresita (2017). "Un enfoque empírico para el análisis de algoritmos que da como resultado aproximaciones a la complejidad temporal Big Theta" (PDF) . Journal of Software . 12 (12).
- ^ McGeoch, Catherine (2012). Una guía para la algorítmica experimental . Cambridge University Press. ISBN 978-1-107-00173-2.
- ^ Coppa, Emilio; Demetrescu, Camil; Finocchi, Irene (2014). "Perfiles sensibles a la entrada". Transacciones IEEE sobre ingeniería de software . 40 (12): 1185-1205. CiteSeerX 10.1.1.707.4347 . doi :10.1109/TSE.2014.2339825.
- ^ Moret, Bernard ME; Bader, David A.; Warnow, Tandy (2002). "Ingeniería de algoritmos de alto rendimiento para la filogenética computacional" (PDF) . The Journal of Supercomputing . 22 (1): 99–111. doi :10.1023/a:1014362705613. S2CID 614550.
- ^ Zaparanuks, Dmitrijs; Hauswirth, Matthias (2012). Perfiles algorítmicos . 33.ª Conferencia ACM SIGPLAN sobre diseño e implementación de lenguajes de programación . Biblioteca digital ACM. págs. 67–76. CiteSeerX 10.1.1.459.4913 .
- ^ "Sobre algorítmica experimental: una entrevista con Catherine McGeoch y Bernard Moret". Ubiquity . 2011 (agosto). Biblioteca Digital ACM. 2011.
- ^ Grzegorz, Mirek (2018). "Gran ambigüedad". código de rendimiento_.
- ^ Kölker, Jonas (2009). "¿Cuándo falla la notación Big-O?". Desbordamiento de pila .
- ^ Lemire, Daniel (2013). "Notación Big-O y rendimiento en el mundo real". WordPress.
- ^ "Cómo encontrar cuellos de botella en las aplicaciones". Ayuda de dotTrace 2018.1 . JetBrains. 2018.
- ^ Shmeltzer, Shay (2005). "Localización de cuellos de botella en el código con el generador de perfiles de eventos". Documentación de Oracle Technology Network JDeveloper . Oracle Corp.
- ^ Shen, Du; Poshyvanyk, Denys; Luo, Qi; Grechanik, Mark (2015). "Automatización de la detección de cuellos de botella en el rendimiento mediante la creación de perfiles de aplicaciones basados en búsquedas" (PDF) . Actas del Simposio Internacional de 2015 sobre Pruebas y Análisis de Software . Biblioteca Digital ACM. págs. 270–281. doi :10.1145/2771783.2771816. ISBN . 9781450336208.S2CID8625903 .
- ^ "Perfiles de rendimiento y memoria y cobertura de código". Centro de aprendizaje de perfiles . SmartBear Software. 2018.
- ^ Janssen, Thorben (2017). "11 consejos sencillos para optimizar el rendimiento de Java". Consejos, trucos y recursos para desarrolladores de Stackify .
- ^ O'Sullivan, Bryan; Stewart, Don; Goerzen, John (2008). "25. Creación de perfiles y optimización". Real World Haskell . O'Reilly Media.
- ^ Linden, Doug (2007). "Elaboración de perfiles y optimización". Wiki de Second Life.
- ^ Pattis, Richard E. (2007). "Análisis de algoritmos, Programación avanzada/Práctica, 15-200". Facultad de Ciencias de la Computación, Universidad Carnegie Mellon.
- ^ Wickham, Hadley (2014). "Optimización de código". Advanced R. Chapman y Hall/CRC.
- ^ Salz, rico (1991). "salvajemat.c". GitHub .
- ^ Cantatore, Alessandro (2003). "Algoritmos de coincidencia de comodines".
- ^ Krauss, Kirk (2008). "Coincidencia de comodines: un algoritmo". Diario del Dr. Dobb .
- ^ Krauss, Kirk (2014). "Coincidencia de comodines: una forma empírica de dominar un algoritmo". Diario del Dr. Dobb .
- ^ Krauss, Kirk (2018). "Coincidencia de comodines: un algoritmo mejorado para big data". Desarrollo para el rendimiento.
- ^ Grehan, Rick (2005). "Perfiles de código: elección de una herramienta para analizar el rendimiento" (PDF) . Freescale Semiconductor.Si, por otro lado, necesita recorrer su código con precisión microscópica, afinando instrucciones individuales de la máquina, entonces un generador de perfiles activo con conteo de ciclos es inmejorable.
- ^ Hough, Richard; et al. (2006). "Evaluación del rendimiento de la microarquitectura con precisión de ciclo". Actas del taller sobre arquitectura introspectiva . Instituto Tecnológico de Georgia. CiteSeerX 10.1.1.395.9306 .
- ^ Khamparia, Aditya; Banu, Saira (2013). Análisis de programas con herramientas de rendimiento y pines de instrumentación dinámica. Conferencia internacional IEEE sobre tendencias emergentes en informática, comunicación y nanotecnología . Biblioteca digital IEEE Xplore.
- ^ Jaskowski, Wojciech; Liskowski, Pawel; Szubert, Marcin Grzegorz; Krawiec, Krzysztof (2016). "El perfil de desempeño: un método de evaluación del desempeño multicriterio para problemas basados en pruebas" (PDF) . Matemática Aplicada e Informática . 26 . De Gruyter: 216.