Apa yang dimaksud dengan perangkat lunak yang efisien? Perangkat lunak yang efisien tidak hanya harus berjalan lebih cepat daripada perangkat lunak yang menjalankan fungsi yang sama, namun juga harus menggunakan sumber daya sistem yang lebih sedikit. Artikel ini menyatukan beberapa pengalaman yang dikumpulkan penulis saat menggunakan VB untuk pengembangan perangkat lunak, dan menggunakan beberapa contoh sederhana untuk menunjukkan kepada Anda cara menulis kode VB yang efisien. Ini berisi beberapa teknik yang mungkin sangat membantu pemrogram VB. Sebelum saya mulai, izinkan saya memperjelas beberapa konsep.
Biarkan kode terbentuk sekaligus: Di antara programmer yang saya temui, banyak orang suka menulis kode terlebih dahulu sesuai dengan persyaratan fungsional, dan kemudian mengoptimalkan kode berdasarkan ini. Pada akhirnya, mereka menemukan bahwa untuk mencapai optimasi, mereka harus menulis ulang kodenya. Jadi saya sarankan Anda mempertimbangkan masalah optimasi sebelum menulis kode.
Pahami hubungan antara hasil optimasi dan pekerjaan yang diperlukan: biasanya ketika sebuah kode selesai, Anda perlu memeriksa dan memodifikasinya. Dalam proses pemeriksaan kode, Anda mungkin menemukan bahwa efisiensi kode di beberapa loop dapat lebih ditingkatkan. Dalam hal ini, banyak pemrogram yang mengejar kesempurnaan dapat segera mengubah kodenya. Saran saya adalah jika mengubah kode ini akan mempersingkat waktu berjalan program satu detik, Anda dapat mengubahnya. Jika hanya dapat menghasilkan peningkatan kinerja 10 milidetik, tidak ada perubahan yang dilakukan. Ini karena menulis ulang sepotong kode pasti akan menimbulkan kesalahan baru, dan men-debug kode baru pasti akan memakan waktu tertentu. Pemrogram harus menemukan keseimbangan antara kinerja perangkat lunak dan jumlah pekerjaan yang diperlukan untuk mengembangkan perangkat lunak, dan 10 milidetik adalah perbedaan yang tidak dapat dihargai oleh pengguna.
Cobalah untuk menggunakan metode berorientasi objek ketika Anda perlu menggunakannya; mekanisme yang disediakan oleh VB tidak sepenuhnya mendukung desain dan pengkodean berorientasi objek, tetapi VB menyediakan kelas-kelas sederhana. Kebanyakan orang percaya bahwa penggunaan objek akan menghasilkan kode yang kurang efisien. Saya pribadi memiliki beberapa pendapat berbeda mengenai hal ini; efisiensi kode tidak dapat dievaluasi hanya dari sudut pandang kecepatan berjalan. Menggunakan kelas dapat membantu Anda meningkatkan kinerja perangkat lunak Anda secara keseluruhan, yang akan saya jelaskan secara rinci pada contoh selanjutnya.
Saat Anda menulis kode VB, saya harap Anda dapat menggunakan poin di atas sebagai prinsip untuk memandu pengkodean Anda. Saya membagi artikel menjadi dua bagian: cara meningkatkan kecepatan berjalan kode dan optimasi kompilasi.
Cara membuat kode Anda berjalan lebih cepat
Metode berikut dapat membantu Anda meningkatkan kecepatan kode Anda:
1. Gunakan bilangan bulat (Integer) dan bilangan bulat panjang (Long)
Cara termudah untuk membuat kode Anda berjalan lebih cepat adalah dengan menggunakan tipe data yang tepat. Anda mungkin tidak mempercayainya, tetapi memilih tipe data yang benar dapat meningkatkan kinerja kode Anda secara signifikan. Dalam kebanyakan kasus, pemrogram dapat mengganti variabel tipe Single, Double, dan Mata Uang dengan variabel tipe Integer atau Long, karena kemampuan VB dalam menangani Integer dan Long jauh lebih tinggi dibandingkan tipe data lainnya.
Dalam kebanyakan kasus, alasan programmer memilih untuk menggunakan Single atau Double adalah karena kemampuannya menyimpan desimal. Namun desimal juga dapat disimpan dalam variabel bertipe Integer. Misalnya, jika ada tiga tempat desimal yang disepakati dalam program, maka Anda hanya perlu membagi nilai yang disimpan dalam variabel Integer dengan 1000 untuk mendapatkan hasilnya. Menurut pengalaman saya, kode dapat berjalan hampir 10 kali lebih cepat dengan menggunakan Integer dan Long daripada Single, Double, dan Mata Uang.
2. Hindari penggunaan varian
Bagi seorang programmer VB, ini jelas. Variabel tipe varian memerlukan ruang 16 byte untuk menyimpan data, sedangkan bilangan bulat (Integer) hanya membutuhkan 2 byte. Biasanya tujuan penggunaan tipe varian adalah untuk mengurangi beban kerja desain dan jumlah kode. Beberapa programmer juga menggunakannya untuk menghemat masalah. Namun jika perangkat lunak dirancang secara ketat dan diberi kode sesuai spesifikasi, penggunaan tipe varian dapat dihindari sepenuhnya.
Ngomong-ngomong, masalah yang sama juga terjadi pada objek Object. Silakan lihat kode di bawah ini:
mFSO
SetFSO=NewScripting.FileSystemObject
atau
RedupkanFSOsebagaiobjek
SetFSO=NewScripting.FileSystemObject
Karena kode di atas tidak menentukan tipe data saat mendeklarasikannya, memori dan waktu CPU akan terbuang percuma selama penugasan. Kode yang benar akan terlihat seperti ini:
DimFSOasNewFileSystemObject
3. Cobalah untuk menghindari penggunaan atribut
Dalam kode harian, kode tidak efisien yang paling umum adalah penggunaan properti (Properti) berulang kali ketika variabel dapat digunakan, terutama dalam loop. Anda harus tahu bahwa kecepatan mengakses variabel sekitar 20 kali lipat dari kecepatan mengakses atribut. Kode berikut digunakan oleh banyak programmer dalam program mereka:
DimintConasInteger
ForintCon=0toUbound(SomVar())
Teks1.Teks=Teks1.Teks&vbcrlf&SomeVar(intCon)
Berikutnya di Con
Kode di bawah ini dieksekusi 20 kali lebih cepat dibandingkan kode di atas.
DimintConasInteger
MeredupkanOutputasString
ForintCon=0toUbound(SomeVar())
sOutput=sOutput&vbCrlf&
BeberapaVar(intCon)
Berikutnya
Teks1.Teks=sOutput
4. Cobalah untuk menggunakan array dan hindari penggunaan set
Kecuali Anda harus menggunakan koleksi, Anda harus selalu menggunakan array. Berdasarkan pengujian, kecepatan akses array bisa mencapai 100 kali lipat kecepatan akses koleksi. Angka ini terdengar agak mengejutkan, namun jika Anda menganggap bahwa koleksi adalah sebuah objek, Anda pasti mengerti mengapa perbedaannya begitu besar.
5. Perluas badan lingkaran kecil
Saat membuat kode, Anda mungkin menghadapi situasi ini: badan perulangan hanya akan mengulang 2 atau 3 kali, dan badan perulangan terdiri dari beberapa baris kode. Dalam hal ini, Anda dapat membuka gulungannya. Alasannya adalah loop memakan waktu CPU ekstra. Namun jika perulangannya lebih rumit, Anda tidak perlu melakukan ini.
6. Hindari penggunaan fungsi yang sangat pendek
Seperti halnya penggunaan loop kecil, memanggil fungsi yang hanya memiliki beberapa baris kode tidaklah ekonomis - pemanggilan fungsi mungkin membutuhkan waktu lebih lama daripada mengeksekusi kode dalam fungsi tersebut. Dalam hal ini, Anda dapat menyalin kode dalam fungsi tersebut ke tempat di mana fungsi tersebut awalnya dipanggil.
7. Mengurangi referensi pada subobjek
Di VB, referensi objek diimplementasikan menggunakan . Misalnya:
Formulir1.Teks1.Teks
Dalam contoh di atas, program mereferensikan dua objek: Form1 dan Text1. Mengutip menggunakan metode ini tidak efisien. Namun sayangnya, tidak ada cara untuk menghindarinya. Satu-satunya hal yang dapat dilakukan programmer adalah menggunakan With atau menyimpan objek anak (Text1) dengan objek lain.
Catatan: Gunakan Dengan
DenganfrmMain.Text1
.Teks="BelajarVB"
.Penjajaran=0
.Tag="Ini hidupku"
.BackColor=vbHitam
.ForeColor=vbPutih
BerakhirDengan
atau
Catatan: Gunakan objek lain untuk menyimpan objek anak
DimtxtTextBoxasTextBox
SettxtTextBox=frmMain.Teks1
TxtTextBox.Text="BelajarVB"
TxtTextBox.Penjajaran=0
TxtTextBox.Tag="Kehidupanku"
TxtTextBox.BackColor=vbHitam
TxtTextBox.ForeColor=vbPutih
Perhatikan bahwa metode yang disebutkan di atas hanya berlaku ketika Anda perlu mengoperasikan sub-objek dari suatu objek. Kode berikut ini salah:
DenganTeks1
.Teks="BelajarVB"
.Penjajaran=0
.Tag="Ini hidupku"
.BackColor=vbHitam
.ForeColor=vbPutih
BerakhirDengan
Sayangnya, kita sering menemukan kode serupa di atas pada kode sebenarnya. Melakukan hal ini hanya akan membuat kode dieksekusi lebih lambat. Alasannya adalah blok With akan membentuk cabang setelah kompilasi, yang akan menambah pekerjaan pemrosesan tambahan.
8. Periksa apakah stringnya kosong
Kebanyakan pemrogram menggunakan metode berikut ketika memeriksa apakah suatu string kosong:
IfText1.Text=""lalu
Catatan: Lakukan suatu tindakan
Endif
Sayangnya, melakukan perbandingan string memerlukan lebih banyak pemrosesan daripada membaca properti. Oleh karena itu saya sarankan Anda menggunakan cara berikut ini:
IfLen(Teks1.Teks)=0lalu
Catatan: Lakukan suatu tindakan
Endif
9. Nama variabel setelah menghilangkan kata kunci Berikutnya
Menambahkan nama variabel setelah kata kunci Berikutnya akan menyebabkan efisiensi kode menurun. Saya tidak tahu mengapa ini terjadi, ini hanya sebuah pengalaman. Namun menurut saya sangat sedikit pemrogram yang mau menambahkan informasi yang berlebihan. Lagi pula, sebagian besar pemrogram adalah orang yang menghargai kata-kata seperti emas.
Komentar: Kode salah
ForiCount=1 hingga 10
Catatan: Lakukan suatu tindakan
BerikutnyaiHitungan
Catatan: Kode yang benar
ForiCount=1 hingga 10
Catatan: Lakukan suatu tindakan
Berikutnya
10. Gunakan array daripada banyak variabel
Jika Anda memiliki beberapa variabel yang menyimpan data serupa, pertimbangkan untuk menggantinya dengan array. Di VB, array adalah salah satu struktur data yang paling efisien.
11. Gunakan array dinamis daripada array statis
Penggunaan array dinamis tidak akan berdampak besar pada kecepatan eksekusi kode, namun dalam beberapa kasus dapat menghemat banyak sumber daya.
12. Hancurkan benda
Apa pun jenis perangkat lunak yang ditulis, pemrogram perlu mempertimbangkan untuk melepaskan ruang memori yang ditempati oleh perangkat lunak tersebut setelah pengguna memutuskan untuk menghentikan perangkat lunak tersebut. Namun sayangnya, banyak programmer yang sepertinya tidak terlalu memperdulikan hal ini. Pendekatan yang benar adalah dengan menghancurkan objek yang digunakan dalam program sebelum keluar dari program. Misalnya:
DimFSOasNewFileSystemObject
Catatan: Lakukan suatu tindakan
Catatan: Hancurkan objek tersebut
SetFSO=Tidak ada
Untuk formulir, Anda dapat menghapus instalasi:
BongkarfrmUtama
atau
SetfrmMain=Tidak ada
13. Senar dengan panjang variabel dan panjang tetap
Secara teknis, string dengan panjang tetap memerlukan lebih sedikit waktu dan ruang pemrosesan dibandingkan string dengan panjang variabel. Namun, kelemahan string dengan panjang tetap adalah dalam banyak kasus, Anda perlu memanggil fungsi Trim untuk menghapus karakter null di akhir string, yang akan mengurangi efisiensi kode. Jadi kecuali panjang string tidak berubah, gunakan string dengan panjang variabel.
14. Gunakan modul kelas alih-alih kontrol ActiveX
Kecuali kontrol ActiveX melibatkan antarmuka pengguna, coba gunakan objek ringan seperti kelas. Ada perbedaan besar dalam efisiensi antara keduanya.
15. Gunakan objek internal
Ketika menggunakan kontrol ActiveX dan DLL, banyak programmer suka mengkompilasinya dan kemudian menambahkannya ke proyek. Saya menyarankan Anda untuk tidak melakukan ini karena menghubungkan ke objek eksternal dari VB memerlukan banyak daya pemrosesan CPU. Setiap kali Anda memanggil suatu metode atau mengakses properti, Anda membuang banyak sumber daya sistem. Jika Anda memiliki kode sumber untuk kontrol ActiveX atau DLL, jadikan kode tersebut sebagai objek pribadi dalam proyek.
16. Kurangi jumlah modul
Beberapa orang suka mempertahankan fungsi umum dalam modul, dan saya setuju dengan itu. Tetapi menulis hanya dua puluh atau tiga puluh baris kode dalam sebuah modul agak konyol. Jika Anda tidak terlalu membutuhkan modul, usahakan untuk tidak menggunakannya. Alasannya adalah karena VB memuat modul ke dalam memori hanya ketika fungsi atau variabel dalam modul dipanggil; modul ini dikeluarkan dari memori ketika aplikasi VB keluar. Jika hanya ada satu modul dalam kode, VB hanya akan melakukan satu operasi pemuatan, sehingga efisiensi kode akan ditingkatkan sebaliknya, jika ada beberapa modul dalam kode, VB akan melakukan beberapa operasi pemuatan, dan efisiensi kodenya akan berkurang.
17. Gunakan array objek
Saat merancang antarmuka pengguna, pemrogram harus mencoba menggunakan array objek untuk kontrol dengan tipe yang sama. Anda dapat melakukan percobaan: tambahkan 100 PictureBox ke jendela, masing-masing dengan nama berbeda, dan jalankan program. Kemudian buat proyek baru, tambahkan juga 100 PictureBox ke jendela, tapi kali ini gunakan array objek, jalankan program, Anda dapat melihat perbedaan waktu pemuatan kedua program.
18. Gunakan metode Pindah
Saat mengubah posisi suatu objek, beberapa programmer suka menggunakan properti Lebar, Tinggi, Atas dan Kiri. Misalnya:
Gambar1.Lebar=100
Gambar1.Tinggi=100
Gambar1.Atas=0
Gambar1.Kiri=0
Faktanya, hal ini sangat tidak efisien, karena program mengubah empat properti, dan setelah setiap modifikasi, jendela akan digambar ulang. Pendekatan yang benar adalah dengan menggunakan metode Pindah:
Gambar1.Pindah0,0,100,100
19. Kurangi penggunaan gambar
Gambar akan memakan banyak memori, dan memproses gambar juga akan memakan banyak sumber daya CPU. Dalam perangkat lunak, jika memungkinkan, pertimbangkan untuk menggunakan warna latar belakang daripada gambar - tentu saja ini hanya sudut pandang orang teknis mengenai masalah ini.
20. Gunakan ActiveXDLL sebagai pengganti kontrol ActiveX
Jika objek ActiveX yang Anda desain tidak melibatkan antarmuka pengguna, gunakan ActiveXDLL.
Optimalisasi kompilasi
Banyak programmer VB yang saya temui tidak pernah menggunakan opsi kompilasi atau mencoba mencari tahu perbedaan antara opsi tersebut. Mari kita lihat arti spesifik dari setiap opsi.
1.P-code (pseudocode) dan kode asli
Anda dapat memilih untuk mengkompilasi perangkat lunak ke kode P atau kode asli. Opsi default adalah kode asli. Jadi apa itu kode P dan kode asli?
Kode-P: Saat mengeksekusi kode di VB, VB terlebih dahulu mengkompilasi kode tersebut menjadi kode-P, lalu menafsirkan dan mengeksekusi kode-P yang telah dikompilasi. Dalam lingkungan yang dikompilasi, penggunaan kode ini lebih cepat daripada kode asli. Setelah memilih P-Code, VB memasukkan pseudocode ke dalam file EXE saat kompilasi.
Kode asli: Kode asli adalah opsi yang diperkenalkan hanya setelah VB6. Saat dikompilasi menjadi file EXE, kode asli dieksekusi lebih cepat daripada kode P. Setelah memilih kode asli, VB menggunakan instruksi mesin untuk menghasilkan file EXE saat kompilasi.
Saat mengompilasi dengan kode asli, saya menemukan terkadang terjadi kesalahan yang tidak dapat dijelaskan. Kode saya dijalankan dengan benar sepenuhnya di lingkungan kompilasi, tetapi file EXE yang dihasilkan dengan opsi kode asli tidak dijalankan dengan benar. Biasanya ini terjadi ketika jendela dibongkar atau jendela pencetakan muncul. Saya memecahkan masalah ini dengan menambahkan pernyataan DoEvent ke kode. Tentu saja kemungkinan terjadinya hal ini sangat jarang terjadi. Mungkin sebagian programmer VB belum pernah menjumpainya, namun memang ada.
Ada juga beberapa opsi dalam kode asli:
a) Pengoptimalan kecepatan kode: Opsi ini dapat mengkompilasi file yang dapat dieksekusi lebih cepat, tetapi file yang dapat dieksekusi lebih besar. Direkomendasikan
b) Pengoptimalan ukuran kode: Opsi ini dapat mengkompilasi file eksekusi yang lebih kecil, namun karena mengorbankan kecepatan, hal ini tidak disarankan.
c) Tanpa pengoptimalan: Opsi ini hanya mengubah kode-P menjadi kode asli tanpa pengoptimalan apa pun. Dapat digunakan saat men-debug kode.
d) Dioptimalkan untuk Pentium Pro: Meskipun opsi ini bukan opsi default dalam kode asli, saya biasanya menggunakan opsi ini. Program yang dapat dieksekusi yang dikompilasi dengan opsi ini dapat berjalan lebih cepat pada mesin PentiumPro dan Pentium2 atau yang lebih baru, namun akan sedikit lebih lambat pada mesin yang lebih lama. Mengingat penggunaan Pentium2 sekarang sudah ketinggalan zaman, disarankan agar semua orang menggunakan opsi ini.
e) Menghasilkan informasi debugging simbolis: Item ini menghasilkan beberapa informasi debugging selama proses kompilasi, memungkinkan pengguna untuk menggunakan alat seperti Visual C++ untuk men-debug kode yang dikompilasi. Menggunakan opsi ini menghasilkan file .pdf yang mencatat informasi bendera dalam file yang dapat dieksekusi. Opsi ini berguna ketika program memiliki fungsi API atau panggilan DLL.
2. Pengoptimalan tingkat lanjut
Pengaturan dalam Pengoptimalan Lanjutan dapat membantu Anda meningkatkan kecepatan perangkat lunak Anda, namun terkadang pengaturan tersebut dapat menimbulkan beberapa bug, jadi saya menyarankan Anda menggunakannya dengan hati-hati. Jika terdapat badan perulangan yang relatif besar atau operasi matematika yang kompleks dalam kode, memilih item tertentu dalam pengoptimalan lanjutan akan sangat meningkatkan kinerja kode. Jika Anda menggunakan fitur pengoptimalan tingkat lanjut, saya sarankan untuk menguji file yang dikompilasi secara ketat.
a) Dengan asumsi tidak ada alias: Ini dapat meningkatkan efisiensi eksekusi kode di badan perulangan, tetapi jika nilai variabel diubah melalui referensi variabel, seperti memanggil metode, referensi variabel digunakan sebagai parameter metode, dan nilai variabel diubah dalam nilai metode, kesalahan akan muncul. Mungkin saja hasil yang dikembalikan salah, atau mungkin kesalahan serius yang menyebabkan program terhenti.
b) Batalkan pemeriksaan pengikatan array, batalkan pemeriksaan integer overflow dan batalkan pemeriksaan kesalahan floating point: Saat program sedang berjalan, jika kesalahan ditemukan melalui pemeriksaan ini, kode penanganan kesalahan akan menangani kesalahan ini. Namun jika pemeriksaan ini dibatalkan, program tidak akan mampu menangani kesalahan. Anda sebaiknya menggunakan opsi ini hanya jika Anda yakin bahwa kesalahan di atas tidak akan terjadi pada kode Anda. Mereka akan sangat meningkatkan kinerja perangkat lunak.
c) Izinkan operasi floating-point tanpa pembulatan: Memilih opsi ini memungkinkan program yang dikompilasi memproses operasi floating-point lebih cepat. Satu-satunya kelemahannya adalah hal ini dapat menyebabkan hasil yang salah ketika membandingkan dua angka floating point.
d) Batalkan pemeriksaan keamanan PentiumFDIV: Opsi ini disetel untuk beberapa chip Pentium lama dan sekarang tampaknya sudah ketinggalan jaman