Articulo de referencia

Código rápido

FastCode es un proyecto de programación de código abierto que tiene como objetivo proporcionar rutinas de biblioteca de tiempo de ejecución optimizadas para Embarcadero Delphi y...

FastCode es un proyecto de programación de código abierto que tiene como objetivo proporcionar rutinas de biblioteca de tiempo de ejecución optimizadas para Embarcadero Delphi y C++ Builder . Este proyecto impulsado por la comunidad fue iniciado en 2003 por Dennis Kjaer Christensen y desde entonces ha aportado funcionalidades optimizadas a la biblioteca de tiempo de ejecución (RTL) de Delphi de 32 bits.

Organizado como una competición dividida en desafíos, FastCode se centra en la optimización de funciones específicas frente a múltiples objetivos. El proyecto ofrece herramientas de evaluación comparativa y procesos de validación para cada contribución funcional. Las contribuciones se puntúan, otorgando puntos en función del rendimiento frente a los objetivos. Embarcadero reconoce e incorpora el código creado por el equipo de FastCode en su base de código Delphi . La mayoría de los participantes en este proyecto son desarrolladores de ensamblador que utilizan código específico del procesador. La lista de desafíos abordados por el proyecto FastCode es extensa; abarca diversas áreas, desde funciones de manipulación de cadenas como PosEx o CompareText hasta operaciones matemáticas como Power o Int64Mul.

Estructura

El proyecto se organiza como una competición dividida en retos. Cada reto consiste en optimizar una función frente a varios objetivos. El proyecto proporciona herramientas para evaluar y validar la contribución de cada función. Se otorga un punto por contribución (máximo una función por objetivo) y se conceden diez puntos al ganador de un objetivo. Se mantiene una lista con todos los participantes y sus puntuaciones, y al final de cada año, hasta 2008, se premiaba a un ganador. Borland , Codegear y Embarcadero , propietarios de Delphi y C++ Builder , han patrocinado históricamente los premios.

La mayoría de los participantes en la competición son desarrolladores de lenguaje ensamblador que a menudo utilizan código de 32 bits específico del procesador y conjuntos de instrucciones adicionales, como MMX , SSE , SSE2 , SSE3 , SSSE3 y SSE4 . [ 1 ]

El proyecto cuenta con el apoyo de Embarcadero, que reconoce las contribuciones del equipo de FastCode e incorpora su código al código base de Delphi. [ 2 ] El gestor de memoria predeterminado para Embarcadero Delphi , FastMM4, es el ganador del desafío FastCode Memory Manager. [ 3 ]

El proyecto se alojó por primera vez en el sitio OptimalCode de Robert Lee , y la página principal de su código fuente es, última actualización en 2008. El código fuente contiene tanto las rutinas mejoradas como los conjuntos de pruebas para evaluar el rendimiento de las rutinas. En 2017, las rutinas de evaluación comparativa para Move, FillChar y el administrador de memoria se portaron a 64 bits, disponibles en.

Pruebas

El proyecto FastCode dedica mucho esfuerzo a las pruebas y se centra en proporcionar software de muy alta calidad. Las pruebas se dividen en dos categorías: pruebas de corrección y pruebas de velocidad.

Validación

La validación se realiza en todas las CPU del conjunto objetivo y, con frecuencia, también en otras CPU y sistemas operativos ( Windows XP , Windows Vista , Windows 7 , etc.). La validación se lleva a cabo con diversas entradas de función, tanto en casos de uso normales como en casos de error. Se compara con valores correctos conocidos y con implementaciones de referencia, como las funciones RTL existentes.

Evaluación comparativa

Las pruebas de rendimiento se realizan en todas las CPU que forman parte del conjunto objetivo actual en un momento dado. Estas CPU han formado o forman parte de los conjuntos objetivo: ( Intel Pentium 3 , Intel Pentium M , Intel Pentium 4 , Intel Core , Intel Core 2 , AMD Athlon XP , AMD Opteron , AMD Phenom ). Se ha tenido mucho cuidado para que las pruebas de rendimiento sean estables y realistas. En particular, la prueba de rendimiento del gestor de memoria fue difícil de realizar de forma justa, y los registros de uso del gestor de memoria se obtuvieron del uso normal de aplicaciones reales y luego se reprodujeron en la prueba de rendimiento.

Objetivos

Las pruebas se realizan en todo el conjunto de objetivos. Cada año se elige un nuevo conjunto de objetivos mediante una votación en la que participa la comunidad de FastCode. Un conjunto de objetivos suele constar de seis CPU, cuatro de Intel y dos de AMD. Esta proporción se ha seleccionado para reflejar la cuota de mercado. Además de estos seis objetivos de CPU, existen diez objetivos definidos como una combinación de los seis. Estos diez objetivos se denominan objetivos computados y pueden ser solo de velocidad o una combinación de velocidad y tamaño. El conjunto máximo de instrucciones permitido es diferente para cada objetivo. Un objetivo podría ser "penalización de tamaño IA32" o "SSE2". La penalización por tamaño se decide para cada desafío mediante una votación.

Lista de desafíos

El proyecto FastCode ha llevado a cabo los siguientes desafíos.:

  • AES ( Estándar de Cifrado Avanzado )
  • AnsiStringReplace (Reemplaza las ocurrencias de una subcadena dentro de una cadena).
  • ArcCos (Calcula el coseno inverso. Versiones con mayor carga para precisión simple, doble y extendida).
  • ArcSin (Calcula el seno inverso. Versiones con mayor capacidad para precisión simple, doble y extendida).
  • Ceil32 (Devuelve el número entero de 32 bits más grande).
  • Ceil64 (Devuelve el número entero de 64 bits más grande).
  • CharPos (Busca la primera aparición de un carácter en una cadena. Devuelve la posición de dicha aparición).
  • CharPosIEx (Búsqueda sin distinción de mayúsculas y minúsculas de la primera aparición de un carácter en una cadena a partir de un índice pasado como parámetro. Devuelve la posición de dicha aparición).
  • CharPosEy (Busca la enésima aparición de un carácter en una cadena a partir de un índice pasado como parámetro. Devuelve la posición de dicha aparición).
  • CharPosRev (Busca la última aparición de un carácter en una cadena. Devuelve la posición de dicha aparición).
  • CompareMem (Compara dos bloques de memoria).
  • CompareStr (Compara dos cadenas de tipo AnsiString).
  • CompareText (Compara dos cadenas de texto).
  • Fillchar (Rellena una sección del búfer de almacenamiento con el mismo byte o carácter FillValue FillCount veces).
  • Floor32 (Devuelve el número entero de aproximadamente 32 bits más pequeño).
  • Floor64 (Devuelve el número entero de aproximadamente 64 bits más pequeño).
  • MCD32 (Máximo Común Divisor de 32 bits)
  • IDCT (Transformada Discreta Inversa del Coseno)
  • Int64Div (Divide dos enteros de 64 bits)
  • Int64Mul (Multiplica dos enteros de 64 bits)
  • IntToStr (Convierte un número entero en una cadena de texto)
  • IsPrime (Comprueba si un entero de 32 bits es primo)
  • LowerCase (Convierte una cadena a minúsculas)
  • MaxFP (Devuelve el máximo de dos valores de punto flotante simples, dobles o extendidos)
  • MaxInt (Devuelve el valor máximo de dos valores enteros)
  • MaxInt64 (Devuelve el valor máximo de dos valores enteros de 64 bits)
  • Administrador de memoria
  • MinFP (Devuelve el mínimo de dos valores de punto flotante simples, dobles o extendidos)
  • MinInt (Devuelve el mínimo de dos valores enteros)
  • MinInt64 (Devuelve el mínimo de dos valores enteros de 64 bits)
  • Mover (Copia N bytes desde el origen al destino)
  • Suma de números complejos polares
  • Resta de números complejos polares
  • Multiplicación de números complejos polares
  • División de números complejos polares
  • Conversión de formato polar a rectangular
  • Pos (Busca la primera aparición de una subcadena en una cadena. Devuelve la posición de dicha aparición).
  • PosEx (busca la primera aparición de una subcadena en una cadena a partir de un índice pasado como parámetro. Devuelve la posición de dicha aparición).
  • PosIEx (Búsqueda sin distinción de mayúsculas y minúsculas para la primera aparición de una subcadena en una cadena a partir de un índice pasado como parámetro. Devuelve la posición de esta aparición).
  • Potencia (devuelve la base elevada al exponente)
  • Suma de números complejos rectangulares
  • Resta de números complejos rectangulares
  • Multiplicación de números complejos rectangulares
  • División rectangular de números complejos
  • Conversión de formato rectangular a polar
  • Conversión de formato de mapa de bits (RGBA a BGRA)
  • Redondeo (redondeo bancario sobre valores simples, dobles o extendidos. Devuelve un entero de 64 bits).
  • RoundToEx (Redondea un valor de punto flotante de precisión extendida a un dígito o potencia de diez especificado utilizando el método de redondeo bancario).
  • Round32 (Redondeo bancario sobre valores simples, dobles o extendidos. Devuelve un entero de 32 bits).
  • Reducción de escala (escalado de mapa de bits)
  • Clasificar
  • StrComp (Compara dos cadenas terminadas en nulo, con distinción entre mayúsculas y minúsculas)
  • StrCopy (Copia una cadena terminada en nulo a otra)
  • StrIComp (Compara dos cadenas terminadas en nulo, sin distinción entre mayúsculas y minúsculas)
  • StrLen (devuelve la longitud de una cadena terminada en nulo)
  • StrLComp (Compara dos cadenas terminadas en nulo hasta una longitud determinada, con distinción entre mayúsculas y minúsculas)
  • StrLIComp (Compara dos cadenas terminadas en nulo hasta una longitud determinada, sin distinción entre mayúsculas y minúsculas)
  • StrToInt32 (Convierte una cadena de texto en un número entero de 32 bits)
  • Recortar (Elimina los espacios en blanco y los caracteres de control del principio y del final de una cadena).
  • TList.Ordenar
  • Trunc (Trunca un valor simple, doble o extendido. Devuelve un entero de 64 bits).
  • Trunc32 (Trunca un valor simple, doble o extendido. Devuelve un entero de 32 bits).
  • Mayúsculas (Convierte una cadena a mayúsculas)
  • Val

Contribuciones a Delphi RTL

Funciones FastCode incluidas en el RTL de Delphi:

  • Delphi 2005: CompareText, Int64Div y FillChar.
  • Delphi 2006: [ 4 ] CompareText, Int64Div y FillChar, administrador de memoria FastMM4. [ 3 ]
  • Delphi 2007—Delphi XE: ArcCos, ArcSin, Power, PosEx, Move, Memory Manager, FillChar, Pos, __lldiv, LowerCase, UpperCase, CompareStr, CompareMem, CompareText, StrLen, StrCopy, StrComp. [ 5 ]

El libro Mastering Delphi de Marco Cantu contiene un capítulo sobre FastCode que enumera las contribuciones a Delphi RTL. [ 6 ]

La biblioteca FastCode

Todos los ganadores del concurso están incluidos en la biblioteca FastCode ( https://fastcode.sourceforge.net/challenge_content/rtl_replcmnt_pkg.html ). Esta biblioteca es de código abierto y se publica bajo la licencia MPL . Se puede utilizar de dos maneras: 1) llamando a las funciones directamente y 2) utilizando la funcionalidad de parcheo.

Al llamar a funciones directamente, depende completamente del desarrollador de la aplicación llamar a la versión de la función que considere más rápida.

Al utilizar la funcionalidad de parcheo, la biblioteca detecta automáticamente el tipo de CPU al cargar la aplicación y utiliza esta información para redirigir todas las llamadas a funciones a la función ganadora de FastCode para esa CPU específica.

Administrador de memoria FastMM4

El gestor de memoria FastMM, utilizado por Delphi y C++ Builder desde 2006, también es ganador de una competición de FastCode. [ 7 ] Reemplazó al gestor de memoria estándar de Delphi y no solo es menos propenso a la fragmentación de memoria, sino que también proporciona mejores posibilidades de depuración, como la capacidad de informar sobre fugas de memoria cuando se cierra la aplicación, [ 8 ] la detección de uso después de la liberación de memoria o liberaciones dobles.

FastMM4 también se utiliza como gestor de memoria para aplicaciones desarrolladas en Lazarus. [ 9 ]

FastMM4 suele figurar como una herramienta "imprescindible" para los desarrolladores de Delphi. [ 10 ]

Nexus DB viene con integración FastMM4 para la comprobación de fugas. [ 11 ]

El uso de FastMM está documentado en "El nuevo administrador de memoria en BDS 2006". [ 12 ]

Aplicaciones que utilizan FastCode

Una aplicación desarrollada en Delphi o C++ Builder suele utilizar el gestor de memoria predeterminado, FastMM4. Las funciones de FastCode en la RTL se han seleccionado por ser las más utilizadas, y una aplicación también suele emplear algunas de ellas, especialmente si se realiza algún tipo de manipulación de cadenas. Por lo tanto, la mayoría de las aplicaciones de Delphi/C++ Builder utilizan código desarrollado por el proyecto FastCode. Algunos ejemplos son Skype , FL Studio y RAD Studio de Embarcadero . El blog de Hallvard describe FastMM4 y explica por qué se utiliza como gestor de memoria en la aplicación "The Online Trader" .

Referencias

  1. "Cómo optimizar al máximo el rendimiento de una aplicación Delphi utilizando la biblioteca FastCode" . Consultado el 3 de septiembre de 2015 .
  2. "Nick Hodges" . Consultado el 3 de septiembre de 2015 .
  3. 1 2 "El oráculo de Delfos" . Archivado del original el 12 de agosto de 2015. Recuperado el 3 de septiembre de 2015 .
  4. Long, Brian y Swart, Bob, "Análisis de Borland Developer Studio 2006", The Delphi Magazine, número 124, diciembre de 2005
  5. "Las contribuciones de la comunidad mejoran el rendimiento de Delphi 2007 RTL" . Archivado del original el 6 de marzo de 2016. Consultado el 3 de septiembre de 2015 .
  6. "Dominando Delphi: Actualización para Delphi 2006" . Consultado el 3 de septiembre de 2015 .
  7. Gabrijelcic, Primoz, "Para gestionar la memoria", The Delphi Magazine, número 126, febrero de 2006
  8. "FastMM4" . Consultado el 3 de septiembre de 2015 .
  9. "Lazarus Free Pascal" . Consultado el 3 de septiembre de 2015 .
  10. "Buenas herramientas para desarrolladores de Delphi" . Programación en Delphi . Consultado el 3 de septiembre de 2015 .
  11. "NexusDB" . Consultado el 3 de septiembre de 2015 .
  12. "El nuevo gestor de memoria en BDS 2006 - por Pierre le Riche" . Consultado el 3 de septiembre de 2015 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=FastCode&oldid=1351897978 "