Setelah membaca artikel berikut, saya menemukan bahwa tes penulis sangat membantu teman-teman yang menggunakan ASP. Seharusnya serupa tidak hanya untuk ASP tetapi bahasa lain. Menghasilkan konten dinamis di server adalah salah satu alasan utama menggunakan ASP, jadi proyek pengujian pertama yang kami pilih adalah menentukan metode terbaik untuk mengirimkan konten dinamis ke aliran respons. Ada dua pilihan dasar (dan beberapa variasinya): menggunakan tag ASP inline dan menggunakan pernyataan Response.Write.
Untuk menguji pendekatan yang berbeda ini, kami membuat halaman ASP sederhana yang mendefinisikan beberapa variabel dan kemudian memasukkannya ke dalam tabel. Meskipun halaman ini sederhana dan tidak berguna secara praktis, halaman ini cukup untuk memungkinkan kami mengisolasi dan menguji permasalahan tertentu.
2.1 Menggunakan tag sebaris ASP
Tes pertama adalah dengan menggunakan tag inline ASP <%= x %>, dimana x adalah variabel. Ini adalah metode yang paling mudah digunakan, dan membuat bagian HTML halaman lebih mudah dibaca dan dipelihara.
Copy kode kodenya sebagai berikut:
<% OPSI EKSPLISIT
Redupkan Nama Depan
RedupNama Belakang
Redupkan Inisial Tengah
Alamat Redup
Kota redup
Keadaan redup
DimPhoneNumber
Redupkan Nomor Faks
Redupkan Email
DimTanggal Lahir
Nama Depan = John
Inisial Tengah = Q
Nama Belakang = Publik
Alamat = 100 Jalan Utama
Kota=New York
Negara Bagian = NY
Nomor Telepon = 1-212-555-1234
Nomor Faks = 1-212-555-1234
Email = [email protected]
Tanggal Lahir = 1/1/1950
%>
<HTML>
<KEPALA>
<TITLE>Uji Respon</TITLE>
</KEPALA>
<TUBUH>
<H1>Uji Respon</H1>
<TABEL>
<tr><td><b>Nama Depan:</b></td><td><%= Nama Depan %></td></tr>
<tr><td><b>Inisial Tengah:</b></td><td><%= Inisial Tengah %></td></tr>
<tr><td><b>Nama Belakang:</b></td><td><%= Nama Belakang %></td></tr>
<tr><td><b>Alamat:</b></td><td><%= Alamat %></td></tr>
<tr><td><b>Kota:</b></td><td><%= Kota %></td></tr>
<tr><td><b>Negara Bagian:</b></td><td><%= Negara Bagian %></td></tr>
<tr><td><b>Nomor Telepon:</b></td><td><%= Nomor Telepon %></td></tr>
<tr><td><b>Nomor Faks:</b></td><td><%= Nomor Faks %></td></tr>
<tr><td><b>EMail:</b></td><td><%= EMail %></td></tr>
<tr><td><b>Tanggal Lahir:</b></td><td><%= Tanggal Lahir %></td></tr>
</TABEL>
</BODI>
</HTML>
Kode lengkap /app1/response1.asp
Rekor terbaik = 8,28 ms/halaman
2.2 Gunakan Response.Write untuk menampilkan setiap baris kode HTML
Ada banyak literatur bagus di luar sana yang menyatakan bahwa pendekatan markup sebaris sebelumnya harus dihindari karena akan menghasilkan operasi yang disebut peralihan konteks. Operasi ini terjadi ketika jenis kode yang diproses oleh server web berubah (dari pengiriman HTML murni ke pemrosesan skrip, atau sebaliknya), dan peralihan ini memerlukan waktu tertentu. Setelah banyak programmer mempelajari hal ini, reaksi pertama mereka adalah menggunakan fungsi Response.Write untuk menampilkan setiap baris kode HTML:
Copy kode kodenya sebagai berikut:
...
Respon.Tulis(<html>)
Respon.Tulis(<head>)
Response.Write( <title>Tes Respon</title>)
Respon.Tulis(</head>)
Respon.Tulis(<body>)
Response.Write(<h1>Tes Respon</h1>)
Respon.Tulis(<tabel>)
Response.Write(<tr><td><b>Nama Depan:</b></td><td> & Nama Depan & </td></tr>)
Response.Write(<tr><td><b>Inisial Tengah:</b></td><td> & Inisial Tengah & </td></tr>)
...
/app1/response2.asp fragmen
Rekor terbaik = 8,28 ms/halaman
Waktu respons = 8,08 ms/halaman
Selisih = -0,20 ms (pengurangan 2,4%)
Peningkatan kinerja yang kami lihat dibandingkan dengan versi markup sebaris sangat kecil sehingga cukup mengejutkan. Ini mungkin karena ada lebih banyak pemanggilan fungsi di halaman tersebut. Namun, metode ini memiliki kelemahan yang lebih besar. Karena kode HTML tertanam dalam fungsinya, kode skrip menjadi sangat panjang dan tidak nyaman untuk dibaca dan dipelihara.
2.3 Gunakan fungsi pembungkus
Response.Write tidak menambahkan CRLF (Carriage Return - Line Feed, Carriage Return - Line Feed) di akhir baris teks, yang merupakan aspek paling mengecewakan dari penggunaan metode di atas. Meskipun kode HTML telah diformat dengan baik di sisi server, yang Anda lihat di browser masih berupa satu baris kode yang panjang. Namun masalah ini bukan satu-satunya kekecewaan. Orang-orang segera mengetahui bahwa tidak ada fungsi Response.WriteLn yang dapat menambahkan CRLF secara otomatis. Reaksi alaminya adalah membuat fungsi pembungkus untuk Response.Write dan menambahkan CRLF setelah setiap baris:
...
writeCR(<tr><td><b>Nama Depan:</b></td><td> & Nama Depan & </td></tr>)
...
SUB tulisCR(str)
Respon.Tulis(str & vbCRLF)
SUB AKHIR
/app1/response4.asp fragmen
Rekor terbaik = 8,08 ms/halaman
Waktu respons = 10,11 ms/halaman
Selisih = +2,03 ms (peningkatan 25,1%)
Dampaknya adalah penurunan kinerja yang signifikan. Tentu saja, hal ini terutama karena metode ini menggandakan jumlah pemanggilan fungsi, dan dampaknya terhadap kinerja sangat jelas. Penggunaan ini harus dihindari dengan cara apa pun, CRLF menghasilkan dua byte tambahan di akhir setiap baris, dan dua byte ini tidak berguna bagi browser untuk menampilkan halaman. Dalam kebanyakan kasus, format kode HTML sisi browser yang indah memudahkan pesaing Anda membaca dan memahami desain halaman.
2.4 Menggabungkan beberapa Response.Write
Mengabaikan pengujian terakhir tentang fungsi enkapsulasi, langkah logis berikutnya adalah menggabungkan semua string dari pernyataan Response.Write yang terpisah menjadi satu pernyataan, sehingga mengurangi jumlah pemanggilan fungsi dan meningkatkan efisiensi kode.
Copy kode kodenya sebagai berikut:
Respon.Tulis(<html> & _
<kepala> & _
<title>Uji Respon</title> & _
</kepala> & _
<tubuh> & _
<h1>Uji Respon</h1> & _
<tabel> & _
<tr><td><b>Nama Depan:</b></td><td> & Nama Depan & </td></tr> & _
...
<tr><td><b>Tanggal Lahir:</b></td><td> & Tanggal Lahir & </td></tr> & _
</tabel> & _
</tubuh> & _
</html>)
/app1/response3.asp fragmen
Rekor terbaik = 8,08 ms/halaman
Waktu respons = 7,05 ms/halaman
Selisih = -1,03 ms (pengurangan 12,7%)
Sejauh ini, ini adalah metode terbaik.
2.5 Gabungkan beberapa Response.Write dan tambahkan CRLF di akhir setiap baris
Beberapa orang juga sangat khawatir tentang apakah kode HTML mereka terlihat indah di sisi browser, jadi kami menambahkan carriage return di akhir setiap baris kode HTML, menggunakan konstanta vbCRLF. Kode pengujian lainnya sama dengan contoh di atas .
...
Respon.Tulis(<html> & vbCRLF & _
<kepala> & vbCRLF & _
<title>Uji Respon</title> & vbCRLF & _
</head> & vbCRLF & _
...
/app1/response5.asp fragmen
Rekor terbaik = 7,05 ms/halaman
Waktu respons = 7,63 ms/halaman
Perbedaan = +0,58 ms (peningkatan 8,5%)
Hasilnya adalah sedikit penurunan kinerja, mungkin karena penambahan operasi penggabungan string dan peningkatan teks keluaran.
2.6 Komentar
Berdasarkan hasil pengujian keluaran ASP di atas, kami sampai pada aturan pengkodean berikut:
Hindari menggunakan ASP tertanam terlalu banyak.
Gabungkan sebanyak mungkin pernyataan Response.Write menjadi satu pernyataan.
Jangan pernah merangkum Response. Tulis hanya untuk menambahkan CRLF.
Jika Anda ingin memformat keluaran HTML, tambahkan CRLF langsung setelah pernyataan Response.Write.
Garis Besar: Apa cara paling efisien untuk menampilkan konten yang dihasilkan secara dinamis oleh ASP? Apa cara terbaik untuk mengekstrak kumpulan data database? Artikel ini menguji hampir 20 masalah umum dalam pengembangan ASP tersebut. Waktu yang ditampilkan oleh alat pengujian memberi tahu kita: masalah-masalah yang biasanya dianggap remeh ini tidak hanya patut diperhatikan, tetapi juga memiliki rahasia tak terduga yang tersembunyi di dalamnya.
1. Tujuan pengujian
Bagian pertama artikel ini membahas beberapa masalah dasar dalam pengembangan ASP dan memberikan beberapa hasil tes kinerja untuk membantu pembaca memahami apa dampak kode yang ditempatkan pada halaman terhadap kinerja. ADO adalah antarmuka database universal dan mudah digunakan yang dikembangkan oleh Microsoft. Ternyata berinteraksi dengan database melalui ADO adalah salah satu aplikasi ASP yang paling penting.
Fungsionalitas yang disediakan oleh ADO cukup luas, sehingga kesulitan terbesar dalam penyusunan artikel ini adalah bagaimana mendefinisikan ruang lingkup masalahnya. Mengingat bahwa mengekstraksi data dalam jumlah besar dapat meningkatkan beban pada server Web secara signifikan, kami memutuskan bahwa tujuan utama bagian ini adalah untuk mengetahui konfigurasi optimal untuk mengoperasikan kumpulan data ADO. Namun, bahkan setelah mempersempit cakupan masalah, kami masih menghadapi kesulitan besar, karena ADO mempunyai banyak cara berbeda untuk menyelesaikan tugas yang sama. Misalnya, kumpulan data dapat diekstraksi tidak hanya melalui kelas Recordset, tetapi juga melalui kelas Koneksi dan Perintah; bahkan setelah mendapatkan objek kumpulan data, ada banyak metode operasi yang dapat mempengaruhi kinerja secara signifikan. Namun, seperti pada Bagian Satu, kami akan mencoba untuk mencakup isu-isu seluas mungkin.
Secara khusus, tujuan bagian ini adalah mengumpulkan informasi yang cukup untuk menjawab pertanyaan-pertanyaan berikut:
Haruskah ADOVBS.inc direferensikan melalui include?
lHaruskah saya membuat objek koneksi terpisah saat menggunakan kumpulan data?
lApa cara terbaik untuk mengekstrak kumpulan data?
lJenis kursor dan metode penguncian rekaman manakah yang paling efisien?
lHaruskah saya menggunakan kumpulan data lokal?
lApa cara terbaik untuk mengatur properti kumpulan data?
lMetode manakah yang paling efisien untuk mereferensikan nilai bidang dalam kumpulan catatan?
lApakah ini cara yang baik untuk mengumpulkan keluaran dengan string sementara?
2. Lingkungan pengujian
Sebanyak 21 file ASP digunakan dalam pengujian ini, yang dapat diunduh dari bagian belakang artikel ini. Setiap halaman diatur untuk menjalankan tiga kueri berbeda, masing-masing mengembalikan 0, 25, dan 250 catatan. Ini akan membantu kita mengisolasi inisialisasi dan overhead yang berjalan pada halaman itu sendiri dari overhead perulangan melalui kumpulan data.
Untuk memfasilitasi pengujian, string koneksi database dan string perintah SQL disimpan sebagai variabel Aplikasi di Global.asa. Karena database pengujian kami adalah SQL Server 7.0, string koneksi menentukan OLEDB sebagai penyedia koneksi, dan data pengujian berasal dari database Northwind SQL Server. Perintah SQL SELECT mengekstrak 7 bidang tertentu dari tabel Pesanan NorthWind.
Copy kode kodenya sebagai berikut:
<BAHASA SKRIP=VBScript RUNAT=Server>
Sub Aplikasi_OnStart
Aplikasi(Samb.) = Penyedia=SQLOLEDB;
Server=Server Saya; & _
uid=sa;
pwd=;
DATABASE=angin utara
Aplikasi(SQL) = SELECTTOP 0OrderID, & _
ID Pelanggan, & _
ID Karyawan, & _
Tanggal Pemesanan, & _
Tanggal yang Diperlukan, & _
Tanggal Pengiriman, & _
Pengangkutan & _
DARI[Pesanan]
Akhiri Sub
</SKRIP>
'sql alternatif - 25 catatan
Aplikasi(SQL) = SELECTTOP 25OrderID, & _
ID Pelanggan, & _
ID Karyawan, & _
Tanggal Pemesanan, & _
Tanggal yang Diperlukan, & _
Tanggal Pengiriman, & _
Pengangkutan & _
DARI[Pesanan]
'catatan sql-250 alternatif
Aplikasi(SQL) = SELECTTOP 250 ID Pesanan, & _
ID Pelanggan, & _
ID Karyawan, & _
Tanggal Pemesanan, & _
Tanggal yang Diperlukan, & _
Tanggal Pengiriman, & _
Pengangkutan & _
DARI[Pesanan]
Konfigurasi server pengujian adalah sebagai berikut: Pentium 450 Mhz, RAM 512 MB, NT Server 4.0 SP5, MDAC 2.1 (Komponen Akses Data), dan Microsoft Scripting Engine versi 5.0. SQL Server berjalan di komputer lain dengan konfigurasi serupa. Seperti pada bagian pertama, kami masih menggunakan Microsoft Web Application Stress Tool untuk mencatat waktu dari permintaan halaman pertama hingga byte terakhir yang diterima dari server (TTLB, Time To Last Byte), waktunya dalam milidetik. Skrip pengujian memanggil setiap halaman lebih dari 1300 kali dan memerlukan waktu sekitar 20 jam untuk dijalankan. Waktu yang ditunjukkan di bawah ini adalah TTLB rata-rata untuk sesi tersebut. Ingat, seperti pada bagian pertama, kami hanya mementingkan efisiensi kode, bukan skalabilitas atau kinerja server.
Perhatikan juga bahwa kami telah mengaktifkan buffering server. Selain itu, untuk membuat semua nama file memiliki panjang yang sama, beberapa nama file memiliki satu atau lebih garis bawah yang tertanam di dalamnya.
3. Tes pertama
Pada pengujian pertama, kami mengekstrak kumpulan data yang mensimulasikan skenario umum yang ditemukan dalam sampel Microsoft ASP ADO. Dalam contoh ini (ADO__01.asp), pertama-tama kita membuka koneksi dan kemudian membuat objek recordset. Tentu saja skrip di sini dioptimalkan sesuai dengan aturan pengkodean yang dirangkum di bagian pertama artikel ini.
Copy kode kodenya sebagai berikut:
<% Opsi Eksplisit %>
<!-- #Sertakan file=ADOVBS.INC -->
<%
Redupkan objekConn
Redupkan objek
Respon.Tulis(_
<HTML><KEPALA> & _
<TITLE>Uji ADO</TITLE> & _
</HEAD><BODI> _
)
Setel objConn = Server.CreateObject(ADODB.Connection)
objConn.Buka Aplikasi (Samb.)
Setel objRS = Server.CreateObject(ADODB.Recordset)
objRS.ActiveConnection = objConn
objRS.CursorType = hanya iklanOpenForward
objRS.LockType = adLockReadOnly
objRS.Buka Aplikasi (SQL)
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judulnya
Respon.Tulis(_
<BATAS TABEL=1> & _
<TR> & _
<TH>ID Pesanan</TH> & _
<TH>ID Pelanggan</TH> & _
<TH>ID Karyawan</TH> & _
<TH>Tanggal Pemesanan</TH> & _
<TH>Tanggal yang Diperlukan</TH> & _
<TH>Tanggal Pengiriman</TH> & _
<TH>Pengiriman</TH> & _
</TR> _
)
'tulis data
Lakukan Sementara Tidak objRS.EOF
Respon.Tulis(_
<TR> & _
<TD> & objRS(ID Pesanan) & </TD> & _
<TD> & objRS(ID Pelanggan) & </TD> & _
<TD> & objRS(ID Karyawan) & </TD> & _
<TD> & objRS(Tanggal Pemesanan) & </TD> & _
<TD> & objRS(Tanggal yang Diperlukan) & </TD> & _
<TD> & objRS(Tanggal Pengiriman) & </TD> & _
<TD> & objRS(Pengangkutan) & </TD> & _
</TR> _
)
objRS.MoveNext
Lingkaran
Respon.Tulis(</TABLE>)
Akhiri Jika
objRS.Tutup
objConn.Tutup
Setel objRS = Tidak Ada
Setel objConn = Tidak Ada
Respon.Tulis(</BODY></HTML>)
%>
Berikut hasil tesnya:
Mari kita lihat arti angka-angka pada setiap kolomnya:
0 mengembalikan TTLB (dalam milidetik) yang diperlukan untuk halaman berisi 0 data. Dalam semua pengujian, nilai ini dianggap sebagai waktu tambahan untuk menghasilkan halaman itu sendiri (termasuk membuat objek), tidak termasuk waktu perulangan melalui data kumpulan data.
25 TTLB dalam milidetik untuk mengambil dan menampilkan 25 catatan
TTLB pada kolom total waktu/2525 dibagi 25, yang merupakan total biaya waktu rata-rata per rekaman.
waktu tampil/2525 kolom TTLB dikurangi 0 kolom TTLB, lalu dibagi 25. Nilai ini mencerminkan waktu yang diperlukan untuk menampilkan satu rekaman saat melakukan perulangan pada kumpulan rekaman.
250 Mengekstrak dan menampilkan TTLB dari 250 catatan.
TTLB di kolom total waktu/250250 dibagi 25. Nilai ini mewakili total biaya waktu rata-rata dari satu rekaman.
waktu disp/250 TTLB pada kolom 250 dikurangi TTLB pada kolom 0, kemudian dibagi 250. Nilai ini mencerminkan waktu yang diperlukan untuk menampilkan satu rekaman saat melakukan perulangan pada kumpulan rekaman.
Hasil tes di atas akan digunakan untuk membandingkan dengan hasil tes selanjutnya.
4. Apakah ADOVBS.inc harus direferensikan melalui penyertaan?
ADOVBS.inc yang disediakan oleh Microsoft berisi 270 baris kode yang mendefinisikan sebagian besar konstanta properti ADO. Contoh kita hanya mereferensikan 2 konstanta dari ADOVBS.inc. Oleh karena itu, dalam pengujian ini (ADO__02.asp) kami menghapus referensi file yang disertakan dan langsung menggunakan nilai yang sesuai saat mengatur properti.
objRS.CursorType = 0?'adOpenForwardOnly
objRS.LockType = 1' adLockReadOnly
Anda dapat melihat bahwa overhead halaman turun sebesar 23%. Nilai ini tidak mempengaruhi waktu pengambilan dan tampilan rekaman individual, karena perubahan di sini tidak memengaruhi operasi kumpulan rekaman dalam loop. Ada beberapa cara untuk mengatasi masalah referensi ADOVBS.inc. Sebaiknya gunakan file ADOVBS.inc sebagai referensi dan jelaskan pengaturannya melalui komentar. Ingat, seperti disebutkan di Bagian 1, penggunaan komentar secara moderat memiliki dampak minimal terhadap efisiensi kode Anda. Metode lain adalah dengan menyalin konstanta yang Anda perlukan dari file ADOVBS.inc ke halaman.
Ada juga cara yang baik untuk mengatasi masalah ini, yaitu membuat semua konstanta ADO tersedia secara langsung dengan menghubungkan ke perpustakaan tipe ADO. Tambahkan kode berikut ke file Global.asa untuk mengakses langsung semua konstanta ADO:
<!--METADATA TYPE=typelib
FILE=C:Program FilesCommon FilesSYSTEMADOmsado15.dll
NAMA=Perpustakaan Jenis ADODB -->
atau:
<!--METADATA TYPE=typelib
UUID=00000205-0000-0010-8000-00AA006D2EA4
NAMA=Perpustakaan Jenis ADODB -->
Oleh karena itu, aturan pertama kami adalah:
lHindari menyertakan file ADOVBS.inc dan mengakses serta menggunakan konstanta ADO melalui metode lain.
5. Haruskah saya membuat objek koneksi terpisah saat menggunakan kumpulan data?
Untuk menjawab pertanyaan ini dengan benar, kita harus menganalisis pengujian dalam dua kondisi berbeda: pertama, halaman tersebut hanya memiliki satu transaksi database, kedua, halaman tersebut memiliki beberapa transaksi database;
Pada contoh sebelumnya, kita membuat objek Connection terpisah dan menugaskannya ke properti ActiveConnection dari Recordset. Namun, seperti yang ditunjukkan di ADO__03.asp, kita juga dapat menetapkan string koneksi langsung ke properti ActiveConnection, sehingga menghilangkan langkah tambahan dalam menginisialisasi dan mengonfigurasi objek Connection dalam skrip.
objRS.ActiveConnection = Aplikasi(Samb.)
Meskipun objek Recordset masih perlu membuat koneksi, pembuatan saat ini dilakukan dalam kondisi yang sangat optimal. Hasilnya, overhead halaman turun 23% lagi dibandingkan pengujian sebelumnya, dan seperti yang diharapkan, waktu tampilan satu catatan tidak berubah secara signifikan.
Oleh karena itu, aturan kedua kami adalah sebagai berikut:
lJika Anda hanya menggunakan satu kumpulan data, tetapkan langsung string koneksi ke properti ActiveConnection.
Selanjutnya kita periksa apakah aturan di atas masih valid ketika halaman menggunakan beberapa kumpulan data. Untuk menguji situasi ini, kami memperkenalkan perulangan FOR untuk mengulangi contoh sebelumnya sebanyak 10 kali. Dalam tes ini kita akan melihat tiga variasi:
Pertama, seperti yang ditunjukkan di ADO__04.asp, objek Connection dibuat dan dimusnahkan di setiap loop:
Copy kode kodenya sebagai berikut:
Redupkan saya
Untuk i = 1 sampai 10
Setel objConn = Server.CreateObject(ADODB.Connection)
objConn.Buka Aplikasi (Samb.)
Setel objRS = Server.CreateObject(ADODB.Recordset)
objRS.ActiveConnection = objConn
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadOnly
objRS.Buka Aplikasi (SQL)
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judulnya
...
'tulis data
...
Akhiri Jika
objRS.Tutup
Setel objRS = Tidak Ada
objConn.Tutup
Setel objConn = Tidak Ada
Berikutnya
Kedua, seperti yang ditunjukkan pada ADO__05.asp, buat objek Connection di luar loop dan bagikan objek ini dengan semua kumpulan data:
Copy kode kodenya sebagai berikut:
Setel objConn = Server.CreateObject(ADODB.Connection)
objConn.Buka Aplikasi (Samb.)
Redupkan saya
Untuk i = 1 sampai 10
Setel objRS = Server.CreateObject(ADODB.Recordset)
objRS.ActiveConnection = objConn
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadOnly
objRS.Buka Aplikasi (SQL)
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judulnya
...
'tulis data
...
Akhiri Jika
objRS.Tutup
Setel objRS = Tidak Ada
Berikutnya
objConn.Tutup
Setel objConn = Tidak Ada
Ketiga, seperti yang ditunjukkan pada ADO__06.asp, tetapkan string koneksi ke properti ActiveConnection di setiap loop:
Copy kode kodenya sebagai berikut:
Redupkan saya
Untuk i = 1 sampai 10
Setel objRS = Server.CreateObject(ADODB.Recordset)
objRS.ActiveConnection = Aplikasi(Samb.)
objRS.CursorType = 0 'adOpenForwardOnly
objRS.LockType = 1 'adLockReadOnly
objRS.Buka Aplikasi (SQL)
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judulnya
...
'tulis data
...
Akhiri Jika
objRS.Tutup
Setel objRS = Tidak Ada
Berikutnya
Seperti yang bisa kita tebak, membuat dan menghancurkan objek koneksi dalam satu lingkaran adalah cara yang paling tidak efisien. Namun yang mengejutkan, menugaskan string koneksi langsung ke properti ActiveConnection dalam loop hanya sedikit lebih lambat dibandingkan berbagi objek Connection tunggal.
Meskipun demikian, aturan ketiga seharusnya adalah:
lKetika beberapa kumpulan catatan digunakan di halaman yang sama, buat satu objek koneksi dan bagikan melalui properti ActiveConnection.
6. Jenis kursor dan metode penguncian rekaman manakah yang paling efisien?
Dalam semua pengujian sejauh ini kami hanya menggunakan kursor maju saja untuk mengakses kumpulan data. Ada tiga jenis kursor yang disediakan oleh ADO untuk kumpulan rekaman: kursor yang dapat digulir statis, kursor yang dapat digulir dinamis, dan kursor kumpulan kunci. Setiap kursor menyediakan fungsi yang berbeda, seperti mengakses rekaman sebelumnya dan rekaman berikutnya, apakah Anda dapat melihat modifikasi data oleh program lain, dll. Namun, pembahasan rinci tentang fungsi masing-masing jenis kursor berada di luar cakupan artikel ini. Tabel berikut adalah analisis perbandingan berbagai jenis kursor.
Semua jenis kursor lainnya memerlukan overhead tambahan dibandingkan dengan kursor yang hanya maju, dan kursor ini umumnya lebih lambat dalam loop. Oleh karena itu, kami ingin menyampaikan kepada Anda peringatan berikut: Jangan pernah berpikir seperti ini - terkadang saya akan menggunakan kursor dinamis, jadi saya akan selalu menggunakan kursor ini.
Sentimen yang sama juga berlaku pada pilihan metode penguncian rekaman. Pengujian sebelumnya hanya menggunakan metode penguncian read-only, namun ada tiga metode lainnya: pemrosesan batch konservatif, terbuka, dan terbuka. Seperti jenis kursor, metode penguncian ini memberikan fungsionalitas dan kontrol berbeda dalam bekerja dengan data kumpulan data.
Kami sampai pada aturan berikut:
lGunakan jenis kursor paling sederhana dan metode penguncian rekaman yang sesuai untuk tugas tersebut.
7. Metode mana yang paling baik digunakan untuk mengekstrak kumpulan data?
Sejauh ini kita telah mengekstraksi kumpulan rekaman dengan membuat objek Kumpulan Rekaman, namun ADO juga menyediakan metode ekstraksi kumpulan rekaman tidak langsung. Tes berikut membandingkan ADO__03.asp dan membuat kumpulan data langsung dari objek Connection (CONN_01.asp):
Copy kode kodenya sebagai berikut:
Setel objConn = Server.CreateObject(ADODB.Connection)
objConn.Buka Aplikasi (Samb.)
Setel objRS = objConn.Execute(Aplikasi(SQL))
Anda dapat melihat bahwa overhead halaman sedikit meningkat dan waktu tampilan satu record tidak berubah.
Mari kita lihat cara membuat objek recordset (CMD__02.asp) langsung dari objek Command:
Copy kode kodenya sebagai berikut:
Setel objCmd = Server.CreateObject(ADODB.Command)
objCmd.ActiveConnection = Aplikasi(Samb.)
objCmd.CommandText = Aplikasi(SQL)
Setel objRS = objCmd.Jalankan
Demikian pula, overhead halaman sedikit meningkat tanpa perubahan besar dalam waktu tampilan satu catatan. Perbedaan kinerja antara dua metode terakhir memang kecil, namun ada masalah penting yang perlu dipertimbangkan.
Saat membuat kumpulan rekaman melalui kelas Recordset, kita dapat mengontrol pemrosesan kumpulan rekaman dengan fleksibilitas terbesar. Karena dua metode terakhir gagal mencapai kinerja yang luar biasa, kami terutama mempertimbangkan jenis kursor dan metode penguncian rekaman yang dikembalikan secara default. Untuk beberapa kesempatan, nilai default belum tentu yang paling ideal.
Oleh karena itu, kecuali ada alasan khusus untuk memilih di antara dua metode terakhir, kami menyarankan untuk mempertimbangkan aturan berikut:
l Buat instance recordset melalui kelas ADODB.Recordset untuk mendapatkan performa dan fleksibilitas terbaik.
8. Haruskah saya menggunakan kumpulan data lokal?
ADO mengizinkan penggunaan kumpulan rekaman lokal (klien). Saat ini, kueri akan mengekstrak semua data dalam kumpulan rekaman. Setelah kueri selesai, koneksi dapat segera ditutup, dan kursor lokal dapat digunakan untuk mengakses data masa depan, yang membawa kemudahan untuk melepaskan koneksi. Menggunakan kumpulan rekaman lokal penting untuk mengakses layanan data jarak jauh yang mengharuskan data digunakan secara offline, namun apakah ini juga berguna untuk aplikasi biasa?
Selanjutnya kita tambahkan atribut CursorLocation dan tutup koneksi (CLIENT1.asp) setelah membuka recordset:
Copy kode kodenya sebagai berikut:
Setel objRS = Server.CreateObject(ADODB.Recordset)
objRS.CursorLocation = 2' adUseClient
objRS.ActiveConnection = Aplikasi(Samb.)
objRS.LockType = 1?'
objRS.Buka Aplikasi (SQL)
objRS.ActiveConnection = Tidak ada
Secara teori, pendekatan ini akan menguntungkan efisiensi karena dua alasan: pertama, pendekatan ini menghindari permintaan data berulang kali melalui koneksi saat berpindah antar catatan. Kedua, pendekatan ini memudahkan persyaratan Sumber Daya. Namun, dari tabel di atas terlihat bahwa menggunakan kumpulan data lokal jelas tidak akan membantu meningkatkan efisiensi. Hal ini mungkin terjadi karena saat menggunakan kumpulan data lokal, kursor selalu menjadi tipe statis, apa pun pengaturan programnya.
Aturan 6 adalah sebagai berikut:
lHal ini harus dihindari kecuali lokalisasi dari recordset benar-benar diperlukan.
10. Metode manakah yang paling efisien digunakan untuk mereferensikan nilai bidang dalam kumpulan data?
10.1 Pengujian
Sejauh ini kami telah mengacu pada nilai bidang dalam kumpulan data berdasarkan nama. Karena metode ini memerlukan pencarian bidang yang sesuai setiap saat, metode ini tidak terlalu efisien. Untuk mendemonstrasikannya, dalam pengujian berikut kami mereferensikan nilai bidang berdasarkan indeksnya dalam koleksi (ADO__08.asp):
Copy kode kodenya sebagai berikut:
'tulis data
Lakukan Sementara Tidak objRS.EOF
Respon.Tulis(_
<TR> & _
<TD> & objRS(0) & </TD> & _
<TD> & objRS(1) & </TD> & _
<TD> & objRS(2) & </TD> & _
<TD> & objRS(3) & </TD> & _
<TD> & objRS(4) & </TD> & _
<TD> & objRS(5) & </TD> & _
<TD> & objRS(6) & </TD> & _
</TR> _
)
objRS.MoveNext
Lingkaran
Seperti yang diharapkan, ada juga perubahan kecil pada overhead halaman (mungkin karena sedikit pengurangan kode). Namun, peningkatan waktu tampilan dengan pendekatan ini cukup nyata.
Pada pengujian berikutnya, kami mengikat semua bidang ke variabel satu per satu (ADO__09.asp):
Copy kode kodenya sebagai berikut:
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judulnya
...
Redupkan fld0
Redupkan fld1
Redupkan fld2
Redupkan fld3
Redupkan fld4
Redupkan fld5
Redupkan fld6
Setel fld0 = objRS(0)
Setel fld1 = objRS(1)
Setel fld2 = objRS(2)
Setel fld3 = objRS(3)
Setel fld4 = objRS(4)
Setel fld5 = objRS(5)
Setel fld6 = objRS(6)
'tulis data
Lakukan Sementara Tidak objRS.EOF
Respon.Tulis(_
<TR> & _
<TD> & fld0 & </TD> & _
<TD> & fld1 & </TD> & _
<TD> & fld2 & </TD> & _
<TD> & fld3 & </TD> & _
<TD> & fld4 & </TD> & _
<TD> & fld5 & </TD> & _
<TD> & fld6 & </TD> & _
</TR> _
)
objRS.MoveNext
Lingkaran
Setel fld0 = Tidak ada
Setel fld1 = Tidak ada
Setel fld2 = Tidak ada
Setel fld3 = Tidak ada
Setel fld4 = Tidak ada
Setel fld5 = Tidak ada
Setel fld6 = Tidak ada
Respon.Tulis(</TABLE>)
Akhiri Jika
Ini merupakan rekor terbaik sejauh ini. Harap dicatat bahwa waktu tampilan satu rekaman telah dikurangi menjadi kurang dari 0,45 milidetik.
Semua skrip di atas memerlukan pemahaman tentang konstruksi kumpulan rekaman hasil. Misalnya, kami menggunakan nama bidang secara langsung di header kolom untuk mereferensikan setiap nilai bidang satu per satu. Pada pengujian berikut, tidak hanya data lapangan yang diperoleh dengan melintasi kumpulan lapangan, namun judul lapangan juga diperoleh dengan cara yang sama. Ini adalah solusi yang lebih dinamis (ADO__10.asp).
Copy kode kodenya sebagai berikut:
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
'tulis judul Response.Write(<TABLE BORDER=1><TR>)
Untuk Setiap objFld di objRS.Fields
Respon.Tulis(<TH> & objFld.name & </TH>)
Berikutnya
Respon.Tulis(</TR>)
'tulis data
Lakukan Sementara Tidak objRS.EOF
Respon.Tulis(<TR>)
Untuk Setiap objFld di objRS.Fields
? Respon.Tulis(<TD> & objFld.value & </TD>)
Berikutnya
Respon.Tulis(</TR>)
objRS.MoveNext
Lingkaran
Respon.Tulis(</TABLE>)
Akhiri Jika
Seperti yang Anda lihat, performa kode mengalami penurunan, namun masih lebih cepat dibandingkan ADO__07.asp.
Contoh pengujian berikutnya merupakan kompromi dari dua metode sebelumnya. Kami akan terus mempertahankan fitur dinamis sambil meningkatkan kinerja dengan menyimpan referensi bidang dalam array yang dialokasikan secara dinamis:
Copy kode kodenya sebagai berikut:
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
Kalau tidak
Redupkan fldCount
fldCount = objRS.Fields.Count
Redupkan bidang()
Redupkan ulang fld(fldCount)
Redupkan saya
Untuk i = 0 hingga fldCount-1
Setel fld(i) = objRS(i)
Berikutnya
'tulis judulnya
Response.Write(<TABLE BORDER=1><TR>) Untuk i = 0 hingga fldCount-1
Respon.Tulis(<TH> & fld(i).nama & </TH>)
Berikutnya
Respon.Tulis(</TR>)
'tulis data
Lakukan Sementara Tidak objRS.EOF
Respon.Tulis(<TR>)
Untuk i = 0 hingga fldCount-1
Respon.Tulis(<TD> & fld(i) & </TD>)
Berikutnya
Respon.Tulis(</TR>)
objRS.MoveNext
Lingkaran
Untuk i = 0 hingga fldCount-1
Setel fld(i) = Tidak ada
Berikutnya
Respon.Tulis(</TABLE>)
Akhiri Jika
Meskipun tidak mengalahkan yang terbaik sebelumnya, ini lebih cepat daripada beberapa contoh pertama, dan memiliki keuntungan dalam memproses kumpulan catatan apa pun secara dinamis.
Dibandingkan dengan kode pengujian sebelumnya, kode pengujian berikut telah diubah secara mendasar. Ia menggunakan metode GetRows dari objek Recordset untuk mengisi array untuk iterasi data, daripada mengakses langsung Recordset itu sendiri. Perhatikan bahwa Recordset diatur ke Nothing segera setelah memanggil GetRows, yang berarti sumber daya sistem dilepaskan sesegera mungkin. Perhatikan juga bahwa dimensi pertama array mewakili bidang dan dimensi kedua mewakili baris (ADO__12.asp).
Copy kode kodenya sebagai berikut:
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
objRS.Tutup
Setel objRS = Tidak Ada
Kalau tidak
'tulis judulnya
...
'atur susunan
Redupkan arrRS
arrRS = objRS.GetRows
'tutup rekor lebih awal
objRS.Tutup
Setel objRS = Tidak Ada
'tulis data
Baris Dimnum
DimnumFlds
Baris redup
Lapangan redup
numFlds = Tidak terikat(arrRS, 1)
numRows = Ubound(arrRS, 2)
Untuk baris= 0 hingga numRows
Respon.Tulis(<TR>)
Untuk fld = 0 hingga numFlds
Respon.Tulis(<TD> & arrRS(fld, baris) & </TD>)
Berikutnya
Respon.Tulis(</TR>)
Berikutnya
Respon.Tulis(</TABLE>)
Akhiri Jika
Saat menggunakan metode GetRows, seluruh kumpulan data diekstraksi ke dalam array. Meskipun masalah sumber daya dapat terjadi ketika kumpulan data sangat besar, mengakses data dalam satu putaran memang lebih cepat karena pemanggilan fungsi seperti MoveNext dan pemeriksaan EOF dibatalkan.
Kecepatan harus dibayar mahal, sekarang metadata kumpulan data hilang. Untuk mengatasi masalah ini, kita dapat mengekstrak informasi header dari objek recordset sebelum memanggil GetRows, selain itu, tipe data dan informasi lainnya juga dapat diekstraksi terlebih dahulu. Perhatikan juga bahwa keunggulan performa dalam pengujian hanya terjadi ketika kumpulan data lebih besar.
Pada pengujian terakhir kumpulan ini, kami menggunakan metode GetString pada kumpulan data. Metode GetString mengekstrak seluruh kumpulan data menjadi string besar dan memungkinkan Anda menentukan pembatas (ADO__13.asp):
Copy kode kodenya sebagai berikut:
Jika objRS.EOF Lalu
Response.Write (Catatan Tidak Ditemukan)
objRS.Tutup
Setel objRS = Tidak Ada
Kalau tidak
'tulis judulnya
...
'atur susunan
Redupkan strTable
strTable = objRS.GetString (2, , </TD><TD>, </TD></TR><TR><TD>)
'tutup rekor lebih awal
objRS.Tutup
Setel objRS = Tidak Ada
Respon.Tulis(strTable & </TD></TR></TABLE>)
Akhiri Jika