Tutorial optimasi kode Delphi:
Pengoptimalan string
Delphi memiliki tiga tipe string: string pendek (string[n], n=1..255) area penyimpanan dialokasikan secara statis, dan ukurannya ditentukan pada waktu kompilasi. Ini diwarisi dari bp for Jenis array karakter dos; (pchar) terutama untuk kompatibilitas dengan berbagai API. Ini telah muncul di bp7 dan sekarang lebih banyak digunakan di Delphi. Area penyimpanannya dapat dialokasikan secara statis dengan array karakter atau dialokasikan secara manual dengan getmem while karakter panjang String (ansistring) unik untuk Delphi. Area penyimpanannya dialokasikan secara dinamis saat runtime, yang paling fleksibel dan paling mudah disalahgunakan.
Tipe string default Delphi AnsiString akan secara otomatis diinisialisasi menjadi kosong tanpa inisialisasi berulang. Kode berikut:
Delphi memiliki tiga tipe string: string pendek (string[n], n=1..255) area penyimpanan dialokasikan secara statis, dan ukurannya ditentukan pada waktu kompilasi. Ini diwarisi dari bp for Jenis array karakter dos; (pchar) terutama untuk kompatibilitas dengan berbagai API. Ini telah muncul di bp7 dan sekarang lebih banyak digunakan di Delphi. Area penyimpanannya dapat dialokasikan secara statis dengan array karakter atau dialokasikan secara manual dengan getmem while karakter panjang Ansistring unik untuk Delphi. Area penyimpanannya dialokasikan secara dinamis saat runtime, yang paling fleksibel dan paling mudah disalahgunakan.
vars:string;
mulai
s:=;
…
akhir;
s:=; tidak diperlukan. Namun perlu dicatat bahwa ini tidak berpengaruh pada hasil nilai pengembalian fungsi. Secara umum, meneruskan argumen var lebih cepat daripada mengembalikan nilai string.
Menggunakan SetLength untuk melakukan pra-alokasi string panjang (AnsiString) untuk mengalokasikan memori secara dinamis adalah keuntungan utama AnsiString, tetapi dapat dengan mudah merugikan diri sendiri. Contoh tipikalnya adalah sebagai berikut:
s2:= ;
untuk i:=2 sampai panjang(s1) lakukan s2:=s2+s1[i];
Belum lagi bisa diganti dengan delete. Masalah utamanya adalah area memori s2 dialokasikan berulang kali dalam loop contoh di atas, yang cukup memakan waktu. Cara sederhana dan efektif adalah sebagai berikut:
setpanjang(s2, panjang(s1)-1);
untuk i:=2 hingga panjang(s1) lakukan s2[i-1]:=s1[i];
Dengan cara ini, memori s2 hanya akan dialokasikan kembali satu kali.
Keamanan Thread dari String dan Array Dinamis (Keamanan Thread) Sebelum Delphi 5, panggilan non-thread-safe untuk operasi pada array dinamis dan string panjang ditangani dengan penghitungan referensi.Namun, sejak Delphi 5, panggilan tersebut telah diubah secara langsung ke beberapa operasi . Awali instruksi penting dengan instruksi kunci untuk menghindari masalah ini. Sayangnya modifikasi ini cukup mahal, karena instruksi kunci pada prosesor pentium II cukup memakan waktu, dan dibutuhkan sekitar 28 siklus instruksi tambahan untuk menyelesaikan operasi ini, sehingga efisiensi keseluruhan berkurang setidaknya setengahnya. Hanya ada satu cara untuk mengatasi masalah ini, yaitu dengan memodifikasi kode inti delphi rtl. Setelah membackup file asli, ganti semua kunci di source/rtl/sys/system.pas dengan {lock}. Ini belum sepenuhnya dioptimalkan. Langkah selanjutnya adalah menghapus instruksi xchg yang juga disertakan dalam perpustakaan runtime delphi4. Karena instruksi ini memiliki awalan kunci implisit, xchg edx dalam proses _lstrasg dan _strlasg di system.pas harus berupa. dihapus. Ganti [eax] dengan kode berikut:
bergerak ecx,[eax]
bergerak[eax],edx
pindahkan edx,ecx
oke, sudah selesai, langsung saja kompilasi dan timpa system.dcu. Dengan cara ini, efisiensi eksekusinya akan 6 kali lebih tinggi dari delphi5 dan 2 kali lebih tinggi dari delphi4.