Tutorial de optimización del código Delphi:
Optimización de cadenas
Delphi tiene tres tipos de cadenas: cadena corta (cadena [n], n = 1..255) El área de almacenamiento se asigna estáticamente y el tamaño se determina en el momento de la compilación. Esto se hereda de bp para. El tipo de matriz de caracteres dos; (pchar) es principalmente para compatibilidad con varias API. Apareció en bp7 y ahora se usa más ampliamente en Delphi. Su área de almacenamiento se puede asignar estáticamente con una matriz de caracteres o manualmente con getmem. La cadena de caracteres largos (ansistring) es exclusiva de Delphi. Su área de almacenamiento se asigna dinámicamente en tiempo de ejecución, que es la más flexible y la más susceptible a abusos.
El tipo de cadena predeterminado de Delphi, AnsiString, se inicializará automáticamente para vaciarlo sin una inicialización repetida. El siguiente código:
Delphi tiene tres tipos de cadenas: cadena corta (cadena [n], n = 1..255) El área de almacenamiento se asigna estáticamente y el tamaño se determina en el momento de la compilación. Esto se hereda de bp para. El tipo de matriz de caracteres dos; (pchar) es principalmente para compatibilidad con varias API. Apareció en bp7 y ahora se usa más ampliamente en Delphi. Su área de almacenamiento se puede asignar estáticamente con una matriz de caracteres o manualmente con getmem. La cadena de caracteres largos (ansistring) es exclusiva de Delphi. Su área de almacenamiento se asigna dinámicamente en tiempo de ejecución, que es la más flexible y la más susceptible a abusos.
vars:cadena;
comenzar
s:=;
…
fin;
s:=; es innecesario. Pero vale la pena señalar que esto no tiene ningún efecto en el resultado del valor de retorno de la función. En términos generales, pasar argumentos var es más rápido que devolver un valor de cadena.
El uso de SetLength para preasignar una cadena larga (AnsiString) para asignar memoria dinámicamente es una gran ventaja de AnsiString, pero puede resultar contraproducente. Un ejemplo típico es el siguiente:
s2:= ;
para i:=2 a longitud(s1) haga s2:=s2+s1[i];
Sin mencionar que se puede reemplazar mediante eliminación. El principal problema es que el área de memoria de s2 se asigna repetidamente en el bucle del ejemplo anterior, lo que lleva bastante tiempo. Una forma sencilla y eficaz es la siguiente:
establecerlongitud(s2,longitud(s1)-1);
para i:=2 a longitud(s1) haga s2[i-1]:=s1[i];
De esta forma, la memoria s2 solo se reasignará una vez.
Seguridad de subprocesos de cadenas y matrices dinámicas Antes de Delphi 5, estas llamadas no seguras para subprocesos para operaciones en matrices dinámicas y cadenas largas utilizaban el recuento de referencias para manejar sus problemas críticos. Sin embargo, desde Delphi 5, se han cambiado directamente a algunas operaciones. Anteponga las instrucciones críticas con la instrucción de bloqueo para evitar este problema. Desafortunadamente, esta modificación es bastante costosa porque la instrucción de bloqueo en el procesador Pentium II requiere bastante tiempo y se necesitan alrededor de 28 ciclos de instrucción adicionales para completar esta operación, por lo que la eficiencia general se reduce al menos a la mitad. Solo hay una forma de resolver este problema: modificar el código central de Delphi RTL. Después de hacer una copia de seguridad del archivo original, reemplace todos los bloqueos en source/rtl/sys/system.pas con {lock}. Por supuesto, se debe reemplazar la palabra completa. Esto aún no se ha optimizado por completo. El siguiente paso es eliminar la instrucción xchg que también se incluye en la biblioteca de ejecución de delphi4. Debido a que esta instrucción tiene un prefijo de bloqueo implícito, el xchg edx en los procesos _lstrasg y _strlasg en system.pas debe hacerlo. ser eliminado. Reemplace [eax] con el siguiente código:
mov ecx, [eax]
mover[eax],edx
movimiento edx, ecx
Bien, ya está, simplemente compílelo y sobrescriba system.dcu. De esta forma, su eficiencia de ejecución será 6 veces mayor que delphi5 y 2 veces mayor que delphi4.