Tutoriel d'optimisation du code Delphi :
Optimisation des chaînes
Delphi a trois types de chaînes : la zone de stockage de chaîne courte (string[n], n=1..255) est allouée de manière statique et la taille est déterminée au moment de la compilation. Elle est héritée de bp for. Le type de tableau de caractères dos; (pchar) est principalement destiné à la compatibilité avec diverses API. Il est apparu dans bp7 et est désormais plus largement utilisé dans Delphi. Sa zone de stockage peut être allouée statiquement avec un tableau de caractères ou manuellement avec getmem ; caractères longs Ansistring est unique à Delphi. Sa zone de stockage est allouée dynamiquement au moment de l'exécution, ce qui est le plus flexible et le plus facilement abusable.
Le type de chaîne par défaut de Delphi, AnsiString, sera automatiquement initialisé à vide sans initialisation répétée. Le code suivant :
Delphi a trois types de chaînes : la zone de stockage de chaîne courte (string[n], n=1..255) est allouée de manière statique et la taille est déterminée au moment de la compilation. Elle est héritée de bp for. Le type de tableau de caractères dos; (pchar) est principalement destiné à la compatibilité avec diverses API. Il est apparu dans bp7 et est désormais plus largement utilisé dans Delphi. Sa zone de stockage peut être allouée statiquement avec un tableau de caractères ou manuellement avec getmem ; caractères longs Ansistring est unique à Delphi. Sa zone de stockage est allouée dynamiquement au moment de l'exécution, ce qui est le plus flexible et le plus facilement abusable.
vars:chaîne;
commencer
s:=;
…
fin;
s:=; n'est pas nécessaire. Mais il convient de noter que cela n’a aucun effet sur le résultat de la valeur de retour de la fonction. De manière générale, transmettre des arguments var est plus rapide que renvoyer une valeur de chaîne.
Utiliser SetLength pour pré-allouer une longue chaîne (AnsiString) afin d'allouer dynamiquement de la mémoire est un avantage majeur d'AnsiString, mais cela peut facilement s'avérer contre-productif. Un exemple typique est le suivant :
s2:= ;
pour i:=2 à length(s1) faites s2:=s2+s1[i];
Sans oublier qu'il peut être remplacé par delete. Le principal problème est que la zone mémoire de s2 est allouée à plusieurs reprises dans la boucle de l'exemple ci-dessus, ce qui prend beaucoup de temps. Un moyen simple et efficace est le suivant :
setlength(s2, longueur(s1)-1);
pour i:=2 à length(s1) faites s2[i-1]:=s1[i];
De cette façon, la mémoire s2 ne sera réaffectée qu’une seule fois.
Sécurité des threads des chaînes et des tableaux dynamiques (Thread Safety) Avant Delphi 5, ces appels d'opérations non thread-safe sur les tableaux dynamiques et les chaînes longues étaient gérés par comptage de références. Cependant, depuis Delphi 5, ils ont été modifiés directement en certaines opérations. . Préfixez les instructions critiques avec l'instruction de verrouillage pour éviter ce problème. Malheureusement, cette modification est assez coûteuse, car l'instruction de verrouillage dans le processeur Pentium II prend beaucoup de temps et il faut environ 28 cycles d'instructions supplémentaires pour terminer cette opération, de sorte que l'efficacité globale est réduite d'au moins la moitié. Il n'y a qu'une seule façon de résoudre ce problème, c'est de modifier le code principal de Delphi RTL. Après avoir sauvegardé le fichier original, remplacez tous les verrous dans source/rtl/sys/system.pas par {lock}. Bien sûr, le mot entier doit être remplacé. Ceci n'est pas encore entièrement optimisé. L'étape suivante consiste à supprimer l'instruction xchg qui est également incluse dans la bibliothèque d'exécution delphi4. Étant donné que cette instruction a un préfixe de verrouillage implicite, l'edx xchg dans les processus _lstrasg et _strlasg dans system.pas doit être. supprimé. Remplacez [eax] par le code suivant :
mov ecx,[eax]
mov[eax],edx
déplacer edx,ecx
ok, vous avez terminé, compilez-le et écrasez system.dcu. De cette façon, son efficacité d’exécution sera 6 fois supérieure à celle de Delphi5 et 2 fois supérieure à celle de Delphi4.