Kinerja adalah sebuah fitur. Anda harus merekayasa kinerja terlebih dahulu, atau Anda harus menulis ulang aplikasi Anda nanti. Oleh karena itu, apa sajakah strategi yang baik untuk memaksimalkan kinerja aplikasi Active Server Pages (ASP)?
Artikel ini menjelaskan teknik untuk mengoptimalkan aplikasi ASP dan Visual Basic® Scripting Edition (VBScript). Artikel ini membahas sejumlah kendala. Saran yang tercantum dalam artikel ini telah diuji di http://www.microsoft.com dan situs lainnya, dan hasilnya sangat signifikan. Artikel ini mengasumsikan bahwa Anda sudah memiliki pemahaman dasar tentang pengembangan ASP, termasuk VBScript dan/atau JScript, Aplikasi ASP, Sesi ASP, dan objek bawaan ASP lainnya (Permintaan, Respons, dan Server).
Biasanya, kinerja ASP terutama bergantung pada banyak faktor selain kode ASP itu sendiri. Daripada mencantumkan semua informasi dalam satu artikel, kami mencantumkan sumber daya terkait kinerja di akhir artikel. Tautan ini mencakup topik ASP dan non-ASP, termasuk ActiveX® Data Objects (ADO), Component Object Model (COM), database, dan konfigurasi Internet Information Server (IIS). Ini adalah beberapa tautan favorit kami - pastikan untuk memeriksanya.
Tip 1: Cache data yang sering digunakan di server Web
Halaman ASP biasa mengambil data dari penyimpanan data back-end dan kemudian mengubah hasilnya menjadi Hypertext Markup Language (HTML). Terlepas dari kecepatan database, mengambil data dari memori selalu jauh lebih cepat dibandingkan mengambil data dari penyimpanan data back-end. Membaca data dari hard drive lokal juga umumnya lebih cepat dibandingkan mengambil data dari database. Oleh karena itu, kinerja seringkali dapat ditingkatkan dengan menyimpan data dalam cache di server Web (disimpan dalam memori atau pada disk).
Caching adalah cara tradisional menukar ruang dengan waktu. Jika Anda menyimpan konten yang tepat dalam cache, Anda dapat melihat peningkatan kinerja yang signifikan. Agar caching menjadi efektif, data yang sering digunakan kembali harus disimpan, dan menghitung ulang data ini memerlukan overhead (yang cukup) besar. Jika cache berisi semua data basi, maka akan menyebabkan pemborosan memori.
Data yang jarang berubah adalah kandidat yang baik untuk disimpan dalam cache karena Anda tidak perlu khawatir tentang sinkronisasi data tersebut dengan database seiring waktu. Daftar kotak kombo, tabel referensi, fragmen DHTML, string Extensible Markup Language (XML), item menu, dan variabel konfigurasi situs (termasuk nama sumber data (DSN), alamat Protokol Internet (IP), dan jalur Web) semuanya merupakan cache yang baik. Kandidat isi. Perhatikan bahwa Anda dapat menyimpan "representasi" data dalam cache tanpa menyimpan data itu sendiri. Jika halaman ASP jarang berubah dan mahal untuk di-cache (misalnya, seluruh katalog produk), Anda harus mempertimbangkan untuk membuat HTML terlebih dahulu daripada menampilkannya kembali sebagai respons terhadap setiap permintaan.
Di mana data harus di-cache dan strategi caching apa yang ada? Biasanya, data disimpan dalam cache di memori atau disk server Web. Dua tip berikutnya mencakup kedua metode tersebut.
Tip 2: Cache data yang sering digunakan dalam objek Aplikasi atau Sesi.
Objek Aplikasi dan Sesi ASP menyediakan wadah yang nyaman untuk menyimpan data dalam memori. Anda dapat menetapkan data ke objek Aplikasi dan Sesi, dan data tetap berada di memori di antara panggilan HTTP. Data sesi disimpan secara terpisah untuk setiap pengguna, sedangkan data Aplikasi dibagikan kepada semua pengguna.
Kapan data harus dimuat ke dalam Aplikasi atau Sesi? Biasanya, data dimuat ketika Aplikasi atau Sesi dimulai. Untuk memuat data selama startup Aplikasi atau Sesi, tambahkan kode yang sesuai ke Application_OnStart() atau Session_OnStart() masing-masing. Fungsi-fungsi ini harusnya ada di Global.asa, jika tidak Anda dapat menambahkannya. Data ini juga dapat dimuat saat pertama kali dibutuhkan. Untuk melakukannya, tambahkan beberapa kode ke halaman ASP (atau tulis fungsi skrip yang dapat digunakan kembali) untuk memeriksa apakah datanya ada dan, jika tidak, muat datanya. Ini adalah teknik kinerja tradisional yang disebut "evaluasi malas" - tidak menghitung nilai sampai Anda tahu bahwa Anda membutuhkannya. Misalnya:
<%
Fungsi Dapatkan Daftar Status Pekerjaan
Redup d
d = Aplikasi(?Daftar Status Ketenagakerjaan?)
Jika d = ??Lalu
' Fungsi FetchEmploymentStatusList (tidak ditampilkan)
' mengambil data dari DB, mengembalikan Array
d = AmbilDaftar Status Pekerjaan()
Aplikasi(?EmploymentStatusList?) = d
Akhiri Jika
DapatkanEmploymentStatusList = d
Fungsi Akhir
%>
Fungsi serupa dapat ditulis untuk setiap blok data yang diperlukan.
Dalam format apa data harus disimpan? Tipe varian apa pun dapat disimpan karena semua variabel skrip adalah tipe varian. Misalnya, Anda dapat menyimpan string, integer, atau array. Biasanya, Anda akan menyimpan konten kumpulan data ADO di salah satu tipe variabel ini. Untuk mendapatkan data dari kumpulan data ADO, Anda dapat menyalin data secara manual ke dalam variabel VBScript, satu kolom dalam satu waktu. Lebih cepat dan mudah menggunakan salah satu fungsi persistensi kumpulan data ADO GetRows(), GetString(), atau Save() (ADO 2.5). Detailnya berada di luar cakupan artikel ini, namun berikut adalah contoh fungsi yang menggunakan GetRows() untuk mengembalikan array data kumpulan data:
' Dapatkan Recordset, kembalikan sebagai Array
Fungsi FetchEmploymentStatusList
Redup
Setel rs = CreateObject(?ADODB.Recordset?)
rs.Buka ?pilih StatusName, StatusID dari EmployeeStatus?, _
?dsn=karyawan;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ?
rs.Tutup
Setr=Tidak ada
End Function
semakin menyempurnakan contoh di atas dengan menyimpan cache HTML sebagai daftar, bukan array. Berikut ini contoh sederhananya:
' Dapatkan Recordset, kembalikan sebagai daftar Opsi HTML
Fungsi FetchEmploymentStatusList
Redupkan rs, fldName, s
Setel rs = CreateObject(?ADODB.Recordset?)
rs.Buka ?pilih StatusName, StatusID dari EmployeeStatus?, _
?dsn=karyawan;uid=sa;pwd=;?
s = ?<pilih nama=??Status Ketenagakerjaan??>?
Setel fldName = rs.Fields(?StatusName?) ' Pengikatan Bidang ADO
Lakukan Sampai rs.EOF
' Baris berikutnya melanggar Jangan Lakukan String Concats,
' tapi tidak apa-apa karena kami sedang membuat cache
s = s & ? <pilihan>? & nama fld & ?</pilihan>?
rs.MoveNext
Lingkaran
s = s & ?</pilih>? & vbCrLf
rs.Tutup
Set rs = Tidak Ada ' Lihat Rilis Lebih Awal
FetchEmploymentStatusList = s ' Mengembalikan data sebagai String
Fungsi Akhir
Dalam kondisi yang sesuai, kumpulan data ADO itu sendiri dapat di-cache dalam lingkup Aplikasi atau Sesi. Ada dua peringatan:
ADO harus ditandai sebagai free-thread dan recordset yang tidak terhubung harus digunakan.
Jika kedua persyaratan ini tidak dijamin, jangan menyimpan data ADO dalam cache. Dalam tips "Komponen non-agile" dan "Jangan cache koneksi" berikut ini, kita membahas bahaya menyimpan objek COM dalam lingkup Aplikasi atau Sesi.
Saat Anda menyimpan data dalam cakupan Aplikasi atau Sesi, data tersebut tetap berada di sana hingga Anda mengubahnya secara terprogram, Sesi berakhir, atau aplikasi Web dimulai ulang. Bagaimana jika data perlu diperbarui? Untuk memaksa pembaruan data Aplikasi secara manual, Anda dapat mengakses halaman ASP khusus administrator untuk memperbarui data. Alternatifnya, Anda dapat menyegarkan data secara otomatis secara berkala melalui suatu fungsi. Contoh berikut menyimpan stempel waktu dengan data cache dan menyegarkan data setelah jangka waktu tertentu.
<%
' kesalahan penyerahan tidak ditampilkan...
Const UPDATE_INTERVAL = 300 'Refresh interval, dalam hitungan detik
' Berfungsi untuk mengembalikan daftar status pekerjaan
Fungsi Dapatkan Daftar Status Pekerjaan
PerbaruiStatus Ketenagakerjaan
GetEmploymentStatusList = Aplikasi(?EmploymentStatusList?)
Fungsi Akhir
' Perbarui data cache secara berkala
Sub UpdateEmploymentStatusList
Redupkan d, strLastUpdate
strLastUpdate = Aplikasi(?LastUpdate?)
Jika (strLastUpdate = ??) Atau _
(UPDATE_INTERVAL < DateDiff(?s?, strLastUpdate, Now)) Lalu
' Catatan: dua panggilan atau lebih mungkin masuk ke sini
' menghasilkan beberapa pengambilan yang tidak perlu (ada solusi untuk ini)
' Fungsi FetchEmploymentStatusList (tidak ditampilkan)
' mengambil data dari DB, mengembalikan Array
d = FetchEmploymentStatusList()
' Perbarui objek Aplikasi.
' untuk memastikan data yang konsisten
Aplikasi.Kunci
Aplikasi(?EmploymentStatusList?) = Acara
Aplikasi(?Pembaruan Terakhir?) = CStr(Sekarang)
Aplikasi. Buka kunci
Akhiri Jika
Akhiri Sub
Lihat ListBox Tercepat di Dunia dengan Data Aplikasi, yang juga memiliki contohnya.
Sadarilah bahwa menyimpan array besar dalam objek Sesi atau Aplikasi bukanlah praktik yang baik. Sintaks bahasa skrip mengharuskan seluruh array harus disalin sementara sebelum mengakses elemen apa pun dari array. Misalnya, jika Anda menyimpan 100.000 elemen array string yang memetakan kode pos AS ke stasiun cuaca lokal di objek Aplikasi, ASP harus terlebih dahulu menyalin semua 100.000 stasiun cuaca ke dalam array sementara. Hanya dengan demikian string dapat diekstraksi. Dalam hal ini, akan lebih baik untuk membuat komponen khusus dengan metode khusus untuk menyimpan stasiun cuaca - atau menggunakan komponen kamus.
Sekadar peringatan lain, jangan membuang bayi bersama air mandi: array dapat dengan cepat dicari dan disimpan dalam memori sebagai pasangan data kunci yang berdekatan. Mengindeks kamus jauh lebih lambat daripada mengindeks array. Anda harus memilih struktur data yang memberikan kinerja terbaik untuk situasi Anda.
Tip 3: Cache data dan HTML pada disk server Web
Terkadang mungkin ada terlalu banyak data untuk di-cache di memori. "Terlalu banyak" hanyalah sebuah cara untuk mengatakan bahwa hal ini bergantung pada berapa banyak memori yang ingin Anda gunakan, serta berapa banyak item yang perlu Anda cache dan seberapa sering Anda ingin mengambilnya. Dalam kasus apa pun, jika data terlalu banyak untuk di-cache di memori, pertimbangkan untuk menyimpan data di hard drive server Web sebagai file teks atau XML. Data dapat di-cache di disk dan di memori secara bersamaan untuk menetapkan strategi caching yang paling tepat untuk situs Anda.
Perhatikan bahwa ketika mengukur kinerja halaman ASP tunggal, mengambil data dari disk belum tentu lebih cepat daripada mengambil data dari database. Namun caching mengurangi beban pada database dan jaringan. Di bawah beban berat, hal ini dapat meningkatkan throughput secara keseluruhan. Ini sangat efektif ketika melakukan cache hasil kueri yang mahal (seperti gabungan multi-tabel atau prosedur tersimpan gabungan) atau kumpulan hasil yang besar. Seperti biasa, uji pro dan kontra dari beberapa opsi.
ASP dan COM menyediakan alat untuk menyiapkan solusi caching berbasis disk. Fungsi recordset ADO Save() dan Open() menyimpan dan memuat recordset dari disk. Anda dapat menggunakan metode ini untuk menulis ulang contoh kode dalam teknik cache data Aplikasi di atas, menggunakan Save() file alih-alih menulis kode ke objek Aplikasi.
Ada beberapa komponen lain yang bekerja dengan file:
Scripting.FileSystemObject memungkinkan Anda membuat, membaca, dan menulis file.
Pengurai Microsoft® XML (MSXML) yang disertakan dengan Internet Explorer mendukung penyimpanan dan pemuatan dokumen XML.
Objek LookupTable (digunakan pada MSN, misalnya) adalah pilihan terbaik untuk memuat daftar sederhana dari disk.
Terakhir, pertimbangkan untuk menyimpan representasi data pada disk daripada data itu sendiri. HTML yang telah dikonversi sebelumnya dapat disimpan pada disk dalam file .htm atau .asp, dan hyperlink dapat mengarah langsung ke file-file ini. Anda dapat menggunakan alat komersial, seperti XBuilder, atau fitur Microsoft® SQL Server® Internet Publishing untuk mengotomatiskan proses pembuatan HTML. Alternatifnya, Anda dapat menempatkan cuplikan kode HTML dalam file .asp. Anda juga dapat menggunakan FileSystemObject untuk membaca file HTML dari disk, atau menggunakan XML untuk mengonversinya lebih awal.
Tip 4: Hindari menyimpan komponen non-agile pada objek Aplikasi atau Sesi
Meskipun menyimpan data pada objek Aplikasi atau Sesi adalah praktik yang baik, menyimpan objek COM dalam cache memiliki kendala yang serius. Biasanya, orang cenderung menyimpan objek COM yang sering digunakan ke dalam objek Aplikasi atau Sesi. Sayangnya, banyak objek COM (termasuk semua objek yang ditulis dalam Visual Basic 6.0 atau yang lebih lama) menyebabkan kemacetan serius ketika disimpan dalam objek Aplikasi atau Sesi.
Khususnya, ketika komponen non-agile di-cache di objek Sesi atau Aplikasi, hal ini akan menyebabkan hambatan kinerja. Komponen agile adalah komponen yang ditandai dengan ThreadingModel=Both, yang menggabungkan marshaler berulir bebas (FTM); atau komponen yang ditandai dengan ThreadingModel=Neutral. (Model Netral baru untuk Windows® 2000 dan COM+.) Komponen berikut ini tidak tangkas:
Komponen berulir bebas (kecuali komponen tersebut menggabungkan FTM).
Komponen benang apartemen.
Komponen berulir tunggal.
Komponen yang dikonfigurasi (perpustakaan Microsoft Transaction Server (MTS)/COM+ dan paket/aplikasi server) tidak tangkas kecuali jika merupakan thread Netral. Komponen berulir apartemen dan komponen non-agile lainnya paling cocok pada cakupan halaman (yaitu, dibuat dan dimusnahkan pada satu halaman ASP).
Di IIS 4.0, komponen yang ditandai dengan ThreadingModel=Both dianggap gesit. Di IIS 5.0, hal ini saja tidak cukup. Komponen tidak hanya harus ditandai Keduanya, tetapi juga harus diagregasi FTM. Artikel tentang agility menjelaskan cara menggabungkan FTM dengan komponen C++ yang ditulis di Perpustakaan Templat Aktif. Sadarilah bahwa jika suatu komponen menyimpan penunjuk antarmuka dalam cache, penunjuk itu sendiri harus tangkas atau harus disimpan dalam tabel antarmuka umum COM (GIT). Jika Anda tidak dapat mengkompilasi ulang kedua komponen thread ke FTM agregat, Anda dapat menandai komponen tersebut dengan ThreadingModel=Neutral. Alternatifnya, jika Anda tidak ingin IIS melakukan pemeriksaan kelincahan (oleh karena itu, Anda dapat mengizinkan komponen non-agile disimpan dalam lingkup Aplikasi atau Sesi), Anda dapat mengatur AspTrackThreadingModel ke True di metabase. Mengubah AspTrackThreadingModel tidak disarankan.
IIS 5.0 akan menimbulkan kesalahan jika Anda ingin menyimpan komponen non-agile yang dibuat dengan Server.CreateObject dalam objek Aplikasi. Anda dapat menghindari kesalahan ini dengan menggunakan <object runat=server scope=application ...> di Global.asa, namun hal ini tidak disarankan karena dapat menyebabkan penggabungan dan serialisasi, yang dijelaskan di bawah.
Apa yang terjadi jika Anda menyimpan komponen non-agile dalam cache? Komponen non-agile yang di-cache di objek Session mengunci Sesi ke thread pekerja ASP. ASP memelihara kumpulan thread pekerja untuk menangani permintaan. Biasanya, permintaan baru selalu ditangani oleh thread pekerja pertama yang tersedia. Jika Sesi dikunci pada sebuah thread, permintaan harus menunggu hingga thread terkait tersedia. Berikut analogi yang mungkin bisa membantu: Anda pergi ke supermarket, memilih beberapa barang, dan membayar di kasir #_3. Setelah itu, setiap kali Anda membayar suatu barang di supermarket tersebut, Anda harus selalu membayar di kasir #_3, meskipun antrian di kasir lain lebih sedikit atau tidak ada sama sekali.
Menyimpan komponen non-agile dalam lingkup Aplikasi memiliki dampak yang lebih buruk terhadap kinerja. ASP harus membuat thread khusus untuk menjalankan komponen non-agile yang disimpan dalam lingkup Aplikasi. Hal ini mempunyai dua konsekuensi: semua panggilan harus disalurkan ke thread ini, dan semua panggilan dimasukkan dalam antrean. "Pooling" berarti bahwa parameter harus disimpan dalam area memori bersama; melakukan peralihan konteks mahal ke thread khusus; menjalankan metode komponen mengumpulkan hasilnya ke dalam area bersama; ke thread aslinya. "Serialisasi" berarti hanya satu metode yang dijalankan pada satu waktu. Dua thread pekerja ASP yang berbeda tidak dapat menjalankan beberapa metode pada komponen bersama secara bersamaan. Hal ini menghilangkan konkurensi, terutama pada komputer multi-prosesor. Yang lebih parah lagi, semua komponen yang tidak termasuk dalam lingkup Aplikasi Agile berbagi satu thread (host STA), sehingga dampak serialisasi menjadi lebih signifikan.
Apa yang bisa saya lakukan? Berikut beberapa aturan umum. Jika Anda menulis objek menggunakan Visual Basic (6.0) atau yang lebih lama, jangan menyimpannya dalam cache di objek Aplikasi atau Sesi. Jika Anda tidak mengetahui model threading suatu objek, jangan menyimpannya dalam cache. Jangan menyimpan objek non-agile dalam cache, melainkan membuat dan melepaskannya di setiap halaman. Objek dijalankan langsung di thread pekerja ASP, sehingga tidak ada pengumpulan atau serialisasi. Jika objek COM berjalan di server IIS, kinerja dapat diterima jika tidak memerlukan waktu lama untuk inisialisasi dan penghapusan. Perhatikan bahwa objek berulir tunggal tidak boleh digunakan dengan cara ini. Hati-hati - VB dapat membuat objek single-thread! Jika Anda harus menggunakan objek single-thread (seperti spreadsheet Microsoft Excel) seperti ini, jangan mengharapkan throughput yang tinggi.
Ketika ADO ditandai sebagai free-threaded, kumpulan data ADO dapat di-cache dengan aman. Untuk menandai ADO sebagai free-threaded, gunakan file Makfre15.bat, yang biasanya terletak di direktori \Program FilesCommonSystemADO.
Peringatan Jika Anda menggunakan Microsoft Access sebagai database, Anda tidak boleh menandai ADO sebagai thread bebas. Recordet ADO juga harus diputuskan sambungannya. Secara umum, jika Anda tidak mengontrol konfigurasi ADO di situs Anda (misalnya, Anda adalah vendor perangkat lunak independen [ISV] yang menjual aplikasi Web kepada pelanggan yang mengelola konfigurasi mereka sendiri), yang terbaik adalah tidak menyimpan kumpulan data dalam cache.
Komponen kamus juga merupakan objek tangkas. LookupTable memuat datanya dari file data dan dapat digunakan untuk data kotak kombo dan informasi konfigurasi. Objek PageCache di Duwamish Books menyediakan sintaksis kamus, seperti halnya Kamus Caprock. Objek-objek ini atau objek turunannya dapat menjadi dasar strategi cache yang efektif. Perhatikan bahwa objek Scripting.Dictionary tidak tangkas dan tidak boleh disimpan dalam cakupan Aplikasi atau Sesi.
Tip 5: Jangan melakukan cache koneksi database di objek Aplikasi atau Sesi
. Caching koneksi ADO umumnya merupakan strategi yang buruk. Jika objek Koneksi disimpan dalam objek Aplikasi dan digunakan di semua halaman, maka semua halaman akan bersaing untuk koneksi ini. Jika objek Connection disimpan dalam objek Sesi ASP, koneksi database akan dibuat untuk setiap pengguna. Hal ini akan meniadakan keuntungan dari pengumpulan koneksi dan memberikan tekanan yang tidak perlu pada server Web dan database.
Daripada menyimpan koneksi database dalam cache, Anda dapat membuat dan menghapus objek ADO di setiap halaman ASP yang menggunakan ADO. Ini efisien karena IIS memiliki pengumpulan koneksi database bawaan. Lebih tepatnya, IIS secara otomatis mengaktifkan pengumpulan koneksi OLEDB dan ODBC. Hal ini memastikan bahwa koneksi yang dibuat dan dihapus pada setiap halaman akan valid.
Karena kumpulan data yang tersambung menyimpan referensi ke koneksi database, Anda tidak boleh menyimpan kumpulan data yang tersambung dalam cache di objek Aplikasi atau Sesi. Namun, Anda dapat dengan aman menyimpan cache kumpulan data yang terputus dan tidak menyimpan referensi ke koneksi datanya. Untuk memutuskan sambungan recordset, lakukan dua langkah berikut:
Set rs = Server.CreateObject(?ADODB.RecordSet?)
rs.CursorLocation = adUseClient ' langkah 1
' Isi kumpulan data dengan data
rs.Buka strQuery, strProv
' Sekarang putuskan sambungan kumpulan data dari penyedia data dan sumber data
rs.ActiveConnection = Tidak ada ' langkah 2
Informasi lebih rinci tentang pengumpulan koneksi dapat ditemukan di materi referensi ADO dan SQL Server.
Tip 6: Gunakan Objek Sesi dengan Benar
Sekarang kita telah membahas keuntungan dari caching dalam Aplikasi dan Sesi, mari kita bahas menghindari penggunaan objek Sesi. Seperti dibahas di bawah, Session memiliki beberapa kelemahan bila digunakan dengan situs yang sibuk. "Sibuk" secara umum berarti situs yang memerlukan ratusan halaman per detik atau ribuan pengguna secara bersamaan. Tip ini bahkan lebih penting lagi untuk situs yang harus diskalakan secara horizontal—yaitu situs yang menggunakan banyak server untuk menangani beban atau mencapai toleransi kesalahan. Untuk situs yang lebih kecil, seperti situs intranet, jika Anda ingin merasakan manfaat yang diberikan oleh Sesi, overhead sistem pasti akan meningkat.
Singkatnya, ASP secara otomatis membuat Sesi untuk setiap pengguna yang mengakses server Web. Setiap Sesi memerlukan sekitar 10 KB overhead memori (yang utama adalah data disimpan dalam Sesi), yang memperlambat semua permintaan. Sesi tetap valid hingga periode waktu tunggu yang dikonfigurasi (biasanya 20 menit) berlalu.
Masalah terbesar dengan Session bukanlah performa, namun skalabilitas. Sesi tidak dapat menjangkau beberapa server Web. Setelah Sesi dibuat di satu server, datanya tetap ada di sana. Artinya jika Anda menggunakan Sesi di server Web, Anda harus merancang kebijakan yang selalu mengirimkan setiap permintaan pengguna ke server tempat Sesi pengguna berada. Ini disebut "menempelkan" pengguna ke server Web. Istilah "sesi lengket" berasal dari sini. Jika server Web mogok, pengguna yang "terjebak" akan kehilangan status sesinya karena sesi tersebut tidak tertahan di disk.
Strategi untuk mencapai sesi yang melekat mencakup solusi perangkat keras dan perangkat lunak. Solusi seperti Network Load Balancing di Windows 2000 Advanced Server dan Cisco Local Director dapat mengimplementasikan sesi yang melekat dengan mengorbankan beberapa tingkat skalabilitas. Solusi-solusi ini tidak sempurna. Tidak disarankan untuk menerapkan solusi perangkat lunak Anda sendiri saat ini (kami biasa menggunakan filter ISAPI dan transformasi URL, dll.).
Objek aplikasi juga tidak menjangkau beberapa server; jika Anda harus berbagi dan memperbarui data Aplikasi di seluruh server Web, Anda harus menggunakan database back-end. Namun, data Aplikasi read-only masih berguna di server Web.
Sebagian besar situs yang sangat penting memerlukan setidaknya dua server Web, hanya untuk meningkatkan waktu aktif (untuk menangani failover dan pemeliharaan server). Oleh karena itu, ketika merancang aplikasi yang sangat penting, Anda harus menerapkan "sesi melekat" atau menghindari penggunaan Sesi dan teknologi manajemen status lainnya yang menyimpan status pengguna di satu server Web.
Jika Anda tidak menggunakan Sesi, pastikan untuk menutupnya. Anda dapat melakukan ini untuk aplikasi melalui Internet Services Manager (lihat dokumentasi ISM). Jika Anda memutuskan untuk menggunakan Sesi, ada beberapa cara yang dapat Anda lakukan untuk mengurangi dampaknya terhadap kinerja.
Anda dapat memindahkan konten yang tidak memerlukan Sesi (seperti layar bantuan, area pengunjung, dll.) ke aplikasi ASP lain yang Sesinya ditutup. Anda dapat meminta ASP berdasarkan halaman demi halaman bahwa Anda tidak lagi memerlukan objek Session pada halaman tersebut, menggunakan arahan berikut di bagian atas halaman ASP:
<% @EnableSessionState=False %>
Alasan bagus untuk menggunakan ini arahannya adalah Sesi ini memiliki masalah menarik dengan kumpulan bingkai. ASP menjamin bahwa hanya satu permintaan yang dieksekusi dalam Sesi setiap saat. Hal ini memastikan bahwa jika browser meminta beberapa halaman untuk pengguna, hanya satu permintaan ASP yang menyentuh Sesi pada satu waktu, sehingga menghindari masalah multi-threading yang terjadi saat mengakses objek Sesi. Sayangnya, semua halaman dalam frameset akan ditampilkan secara serial, satu demi satu, bukan secara bersamaan. Pengguna mungkin harus menunggu lama untuk melihat semua frame. Pesan moral dari cerita ini: Jika beberapa halaman frameset tidak bergantung pada Sesi, pastikan untuk memberitahu ASP menggunakan direktif @EnableSessionState=False.
Ada banyak cara untuk mengelola status Sesi yang dapat menggantikan penggunaan objek Sesi. Untuk jumlah status yang kecil (kurang dari 4 KB), kami biasanya merekomendasikan penggunaan Cookie, variabel QueryString, dan variabel implisit. Untuk volume data yang lebih besar, seperti keranjang belanja, database back-end adalah pilihan yang paling sesuai. Banyak yang telah ditulis tentang teknik manajemen negara di peternakan server Web. Untuk informasi selengkapnya, lihat Referensi status sesi.
Tip 7: Enkapsulasi kode dalam objek COM
Jika Anda memiliki banyak VBScript atau JScript, Anda sering kali dapat meningkatkan kinerja dengan memindahkan kode Anda ke dalam objek COM yang dikompilasi. Kode yang dikompilasi biasanya berjalan lebih cepat daripada kode yang diinterpretasikan. Objek COM yang dikompilasi dapat mengakses objek COM lainnya melalui "pengikatan awal", yang merupakan metode pemanggilan objek COM yang lebih efisien daripada "pengikatan akhir" yang digunakan oleh skrip.
Mengenkapsulasi kode dalam objek COM memiliki beberapa keunggulan (selain kinerja):
Objek COM membantu memisahkan logika presentasi dari logika bisnis.
Objek COM memastikan penggunaan kembali kode.
Banyak pengembang menemukan bahwa kode yang ditulis dalam VB, C++, atau Visual J++ lebih mudah untuk di-debug daripada ASP.
Objek COM juga memiliki kelemahan, antara lain waktu pengembangan awal dan memerlukan keterampilan pemrograman yang berbeda. Perhatikan bahwa merangkum sejumlah kecil ASP dapat menyebabkan penurunan kinerja tanpa meningkatkan kinerja. Situasi ini biasanya terjadi ketika sejumlah kecil kode ASP dienkapsulasi menjadi objek COM. Dalam hal ini, biaya pembuatan dan pemanggilan objek COM melebihi keuntungan dari kode yang dikompilasi. Trial and error harus digunakan untuk menentukan kombinasi skrip ASP dan kode objek COM yang menghasilkan kinerja terbaik. Perhatikan bahwa ada peningkatan signifikan dalam skrip dan kinerja ADO di Windows 2000/IIS 5.0 dibandingkan dengan Microsoft Windows NT® Oleh karena itu, dengan diperkenalkannya IIS 5.0, keunggulan kinerja kode yang dikompilasi dibandingkan kode ASP mengalami penurunan.
Untuk pembahasan rinci mengenai keuntungan dan kerugian menggunakan COM di ASP, lihat Pedoman Komponen ASP dan Pemrograman Aplikasi Terdistribusi dengan dan Microsoft Visual Basic 6.0. Jika Anda menggunakan komponen COM, sangat penting untuk mengujinya saat dimuat. Faktanya, semua aplikasi ASP harus diuji bebannya.
Tip 8: Dapatkan sumber daya nanti dan rilis lebih awal.
Berikut ini sedikit tip untuk referensi Anda. Secara umum, lebih baik memperoleh sumber daya nanti dan melepaskannya lebih awal. Hal ini berlaku untuk objek COM serta pegangan file dan sumber daya lainnya.
Metode optimasi ini terutama digunakan untuk koneksi dan kumpulan data ADO. Ketika Anda selesai dengan sebuah recordset, katakanlah setelah menampilkan tabel dan datanya, Anda harus segera melepaskannya daripada menunggu sampai akhir halaman. Praktik terbaiknya adalah menyetel variabel VBScript ke Nothing. Jangan biarkan kumpulan data keluar dari jangkauan. Juga, lepaskan objek Command atau Connection yang terkait (jangan lupa untuk memanggil Close() sebelum mengatur recordset atau koneksi ke = Nothing). Hal ini mempersingkat waktu database menyiapkan sumber daya untuk Anda dan melepaskan koneksi database ke kumpulan koneksi secepat mungkin.
Tip 9: Eksekusi Di Luar Proses Memperdagangkan Kinerja untuk Keandalan
Baik ASP dan MTS/COM+ memiliki opsi konfigurasi yang memungkinkan Anda menukar keandalan dengan kinerja. Saat membangun dan menerapkan aplikasi, Anda harus mengetahui cara menyeimbangkan kinerja dengan keduanya.
Opsi ASP mengonfigurasi aplikasi ASP agar berjalan dengan salah satu dari tiga cara. Di IIS 5.0, istilah "tingkat isolasi" diperkenalkan untuk menjelaskan opsi ini. Tiga tingkat isolasi tersebut adalah tingkat rendah, tingkat menengah dan tingkat tinggi:
isolasi tingkat rendah. Ini didukung di semua versi IIS dan merupakan yang tercepat. Ini menjalankan ASP di Inetinfo.exe, yang merupakan proses IIS utama. Jika aplikasi ASP crash, IIS juga akan crash. (Untuk me-restart IIS di bawah IIS 4.0, administrator situs Web harus memantau situs menggunakan alat seperti InetMon dan mengaktifkan file batch untuk me-restart server jika server gagal. IIS 5.0 memperkenalkan restart yang andal, yang merupakan metode untuk me-restart server yang gagal secara otomatis. ).
Isolasi menengah. IIS 5.0 memperkenalkan level baru ini, yang disebut level di luar proses karena ASP berjalan di luar proses IIS. Dalam isolasi menengah, semua aplikasi ASP dikonfigurasi untuk dijalankan sebagai isolasi menengah berbagi ruang proses. Hal ini mengurangi jumlah proses yang diperlukan untuk menjalankan beberapa aplikasi ASP di luar proses pada satu server. Isolasi sedang adalah tingkat isolasi default di IIS 5.0.
Isolasi tingkat lanjut. Level ini didukung di IIS 4.0 dan IIS 5.0, dan isolasi tingkat lanjut juga tidak lagi dalam proses. Jika ASP crash, server Web tidak crash. Aplikasi ASP secara otomatis akan restart saat permintaan ASP dibuat lagi. Dalam isolasi lanjutan, setiap aplikasi ASP yang dikonfigurasi untuk dijalankan saat isolasi lanjutan berjalan di ruang prosesnya sendiri. Melakukan hal ini melindungi aplikasi ASP dari interferensi satu sama lain. Kekurangannya adalah memerlukan proses terpisah untuk setiap aplikasi ASP. Ketika banyak aplikasi harus dijalankan pada satu server, overhead sistem meningkat secara signifikan.
Pilihan mana yang terbaik? Di IIS 4.0, kehabisan proses akan mengurangi kinerja secara signifikan. Di IIS 5.0, banyak perbaikan telah dilakukan untuk meminimalkan overhead yang disebabkan oleh berjalannya aplikasi ASP di luar proses. Faktanya, di sebagian besar pengujian, aplikasi ASP di luar proses di IIS 5.0 berjalan lebih cepat dibandingkan aplikasi dalam proses di IIS 4.0. Terlepas dari itu, pada kedua platform, dalam proses (tingkat isolasi rendah) memiliki performa terbaik. Namun, jika tingkat akses relatif rendah atau throughput maksimum rendah, keuntungan dari tingkat isolasi yang rendah menjadi kurang jelas. Oleh karena itu, menyetel tingkat isolasi rendah mungkin hanya diperlukan jika Anda memerlukan ratusan atau ribuan halaman per detik per server Web. Seperti biasa, uji beberapa konfigurasi untuk menentukan kompromi mana yang ingin Anda lakukan.
Perhatikan bahwa ketika Anda menjalankan aplikasi ASP di luar proses (isolasi menengah atau tinggi), aplikasi tersebut berjalan di MTS di NT4 dan di COM+ di Windows 2000. Artinya, di NT4 dijalankan di Mtx.exe; di Windows 2000, dijalankan di DllHost.exe. Anda dapat melihat proses ini berjalan di Task Manager. Anda juga dapat melihat bagaimana IIS mengkonfigurasi paket MTS atau aplikasi COM+ untuk aplikasi ASP di luar proses.
Opsi COM Komponen COM juga memiliki tiga opsi konfigurasi, meskipun tidak persis sama dengan opsi ASP. Komponen COM dapat "tidak dikonfigurasi", dikonfigurasi sebagai aplikasi perpustakaan, atau dikonfigurasi sebagai aplikasi server. "Tidak dikonfigurasi" berarti komponen tersebut tidak terdaftar dengan COM+. Komponen akan berjalan di ruang proses dari program pemanggil, yaitu komponen "dalam proses". Aplikasi perpustakaan juga sedang dalam proses, tetapi menggunakan layanan COM+, termasuk keamanan, transaksi, dan dukungan konteks. Aplikasi server dikonfigurasi untuk berjalan dalam ruang prosesnya sendiri.
Anda dapat melihat bahwa komponen yang tidak dikonfigurasi memiliki sedikit keunggulan dibandingkan aplikasi perpustakaan. Aplikasi perpustakaan memiliki keunggulan kinerja yang lebih besar dibandingkan aplikasi server. Hal ini karena aplikasi perpustakaan berjalan dalam proses yang sama dengan ASP, sedangkan aplikasi server berjalan dalam prosesnya sendiri. Panggilan antar-proses lebih mahal daripada panggilan intra-proses. Lebih jauh lagi, ketika meneruskan data seperti kumpulan data antar proses, semua data harus disalin di antara kedua proses tersebut.
perangkap! Saat menggunakan aplikasi server COM, jika Anda meneruskan objek antara ASP dan COM, pastikan objek tersebut menjalankan "bundel berdasarkan nilai" atau MBV. Objek yang melakukan MBV menyalin dirinya sendiri dari satu proses ke proses lainnya. Ini lebih baik daripada pendekatan dimana objek masih dalam proses pembuat dan proses lain memanggil proses pembuatan berulang kali untuk menggunakan objek tersebut. Kumpulan data ADO yang terputus akan "dikelompokkan berdasarkan nilai", sedangkan kumpulan data yang terhubung tidak akan "dikelompokkan berdasarkan nilai". Scripting.Dictionary tidak menjalankan MBV dan tidak diteruskan antar proses. Terakhir, catatan untuk programmer VB: MBV tidak diperoleh dengan melewatkan parameter ByVal. MBV dilakukan oleh pembuat komponen asli.
apa yang harus dilakukan?
Jika kami diminta untuk menyarankan konfigurasi yang masuk akal yang menyeimbangkan kinerja dan keandalan, konfigurasi tersebut adalah sebagai berikut:
Di IIS 4.0, gunakan tingkat isolasi ASP rendah dan gunakan paket server MTS.
Pada IIS 5.0, gunakan tingkat isolasi menengah ASP dan gunakan aplikasi perpustakaan COM+.
Ini adalah prinsip yang sangat umum; perusahaan hosting biasanya menjalankan ASP pada tingkat isolasi menengah atau tinggi, sedangkan server Web tujuan tunggal dapat berjalan pada tingkat isolasi rendah. Pertimbangkan pro dan kontra dan putuskan sendiri konfigurasi mana yang lebih sesuai dengan kebutuhan Anda.
Tip 10: Gunakan
opsi opsi eksplisit eksplisit harus digunakan di file .asp. Petunjuk ini ditempatkan di bagian atas file .asp dan memaksa pengembang untuk menyatakan semua variabel untuk digunakan. Banyak programmer menemukan metode ini bermanfaat dalam debugging aplikasi karena menghindari kemungkinan nama variabel yang salah dan secara tidak sengaja membuat variabel baru (misalnya, myxmlstring =) alih -alih myxlmstring = ....
Mungkin yang lebih penting, variabel yang dinyatakan lebih cepat daripada variabel yang tidak diumumkan. Dengan cara ini, setiap kali skrip menggunakan variabel yang tidak dideklarasikan saat runtime, ia merujuknya dengan nama. Di sisi lain, variabel dinyatakan secara berurutan, baik pada waktu kompilasi atau waktu berjalan. Mulai sekarang, variabel yang dinyatakan dirujuk dalam urutan ini. Karena Opsi Eksplisit memaksa variabel deklarasi, ini memastikan bahwa semua variabel dinyatakan, jadi aksesnya cepat.
Tip 11: Gunakan variabel lokal dalam subrutin dan fungsi
variabel lokal adalah variabel yang dinyatakan dalam subrutin dan fungsi. Dalam fungsi atau subrutin, akses variabel lokal lebih cepat daripada akses variabel global. Penggunaan variabel lokal juga akan membuat kode lebih jelas, sehingga variabel lokal harus digunakan jika memungkinkan.
Tip 12: Salin data yang sering digunakan ke dalam variabel skrip
saat mengakses objek COM di ASP, data objek yang sering digunakan harus disalin ke dalam variabel skrip. Melakukan hal ini mengurangi panggilan metode COM, yang relatif mahal dibandingkan dengan mengakses variabel skrip. Teknik ini juga mengurangi pencarian mahal saat mengakses objek pengumpulan dan kamus.
Secara umum, jika Anda berencana untuk mengakses data objek lebih dari sekali, Anda harus memasukkan data dalam variabel skrip. Target utama dari optimasi ini adalah variabel permintaan (bentuk dan variabel querystring). Misalnya, situs Anda dapat melewati variabel querystring bernama UserId. Katakanlah UserID ini direferensikan 12 kali pada halaman tertentu. Alih -alih memanggil permintaan (? UserId?) 12 kali, Anda dapat menetapkan UserID ke variabel di bagian atas halaman ASP. Kemudian gunakan variabel itu di seluruh halaman. Ini menyimpan 11 panggilan metode COM.
Bahkan, mengakses properti atau metode COM tidak semahal itu. Berikut adalah contoh dari beberapa kode yang cukup umum (secara sintaksis):
foo.bar.blah.baz = foo.bar.blah.qaz (1)
Jika foo.bar.blah.zaq = foo.bar.blah.abc maka '...
Ketika kode ini berjalan, inilah yang terjadi:
variabel foo diselesaikan ke objek global.
Bilah variabel diselesaikan sebagai anggota FOO. Ini sebenarnya adalah panggilan metode COM.
Variabel bla diselesaikan sebagai anggota foo.bar. Ini adalah panggilan metode COM lainnya.
Variabel Qaz diselesaikan sebagai anggota foo.bar.blah. Itu benar, ini masih merupakan panggilan metode COM.
Hubungi foo.bar.blah.quaz (1). Panggilan metode COM lainnya. Mengerti?
Lakukan Langkah 1 hingga 3 lagi untuk Parse Baz. Sistem tidak tahu apakah memanggil QAZ mengubah model objek, jadi Langkah 1 hingga 3 harus dilakukan lagi untuk menyelesaikan BAZ.
Selesaikan Baz sebagai anggota foo.bar.blah. Tetapkan atribut.
Lakukan Langkah 1 hingga 3 lagi untuk Parse Zaq.
Lakukan Langkah 1 hingga 3 lagi untuk Parse ABC.
Seperti yang Anda lihat, efisiensinya sangat buruk (dan lambat). Cara cepat untuk menulis kode ini dalam vbscript adalah:
atur myobj = foo.bar.blah 'lakukan resolusi bla sekali
Myobj.baz = myobj.qaz (1)
Jika myobj.zaq = myobj.abc maka '...
Jika Anda menggunakan VBScript 5.0 atau lebih tinggi, Anda dapat menulis kode ini menggunakan pernyataan dengan dengan dengan:
dengan foo.bar.blah
.baz = .qaz (1)
Jika .zaq = .abc maka '...
...
Akhiri dengan
catatan bahwa teknik ini juga berlaku untuk pemrograman VB.
Tip 13: Hindari array
redim array ulang harus dihindari jika memungkinkan. Dalam hal kinerja, jika komputer memiliki ukuran memori fisik yang terbatas, lebih baik untuk mengatur dimensi awal array ke skenario terburuknya-atau untuk mengatur dimensi ke skenario kasus terbaiknya, dan kemudian dimaksudkan kembali sesuai kebutuhan. Ini tidak berarti hanya mengalokasikan beberapa megabyte memori ketika Anda tahu Anda tidak akan membutuhkannya.
Kode berikut menunjukkan kepada Anda penggunaan redup dan redim yang tidak pantas.
<%
Dimmyarray ()
Redimmyarray (2)
Myarray (0) =? Halo?
Myarray (1) =? Selamat tinggal?
Myarray (2) =? Perpisahan?
...
'Beberapa kode lain di mana Anda akhirnya membutuhkan lebih banyak ruang terjadi, lalu ...
Redim Preserve myarray (5)
Myarray (3) =? Lebih banyak barang?
Myarray (4) =? Bahkan lebih banyak barang?
Myarray (5) =? Namun lebih banyak barang?
%>
Jauh lebih baik untuk meredupkan ukuran awal array dengan benar dari awal (dalam hal ini, 5) daripada redim array untuk membuatnya lebih besar. Anda mungkin menyia -nyiakan beberapa memori (jika Anda tidak menggunakan semua elemen), tetapi manfaatnya menjadi lebih cepat.
Tip 14: Gunakan buffering respons
Anda dapat buffer seluruh halaman output dengan mengaktifkan "buffering respons." Ini meminimalkan jumlah penulisan ke browser, meningkatkan kinerja keseluruhan. Setiap operasi penulisan menimbulkan overhead yang signifikan (baik dalam IIS maupun dalam hal jumlah data yang dikirim melalui jaringan), sehingga semakin sedikit yang menulis semakin baik. Karena start-up yang lambat dan penggunaan algoritma mengomel (digunakan untuk mengurangi kemacetan jaringan), TCP/IP jauh lebih efisien ketika mengirim beberapa potongan data yang besar daripada ketika harus mengirim banyak potongan kecil.
Ada dua cara untuk memungkinkan buffering respons. Pertama, Anda dapat menggunakan Internet Services Manager untuk mengaktifkan buffering respons untuk seluruh aplikasi. Kami merekomendasikan pendekatan ini, memungkinkan buffering respons secara default untuk aplikasi ASP baru di IIS 4.0 dan IIS 5.0. Kedua, Anda dapat mengaktifkan buffering respons dengan menambahkan baris kode berikut di dekat bagian atas setiap halaman ASP:
< % response.buffer = true %>
Baris kode ini harus dieksekusi sebelum data respons apa pun ditulis ke browser (yaitu, sebelum HTML muncul dalam skrip ASP dan sebelum cookie diatur menggunakan Koleksi Response.Cookies). Secara umum, yang terbaik adalah memungkinkan buffering respons untuk seluruh aplikasi. Dengan cara ini, Anda tidak perlu menulis baris kode di atas di bagian atas setiap halaman.
Respon. Siram
Keluhan umum tentang buffering respons adalah bahwa pengguna menganggap halaman ASP lambat untuk merespons (meskipun waktu respons secara keseluruhan ditingkatkan) karena mereka harus menunggu sampai seluruh halaman dihasilkan sebelum mereka dapat melihat apa pun. Untuk halaman yang sudah berjalan lama, Anda dapat mengatur respons.buffer = false untuk menonaktifkan buffering respons. Namun, strategi yang lebih baik adalah memanfaatkan metode respons. Metode ini mengirimkan semua HTML yang dikonversi oleh ASP ke browser. Misalnya, setelah mengonversi 100 baris pertama dari tabel 1.000-baris, ASP dapat memanggil respons.Flush untuk memaksa hasil konversi ke browser, memungkinkan pengguna untuk melihat 100 baris pertama sebelum baris yang tersisa siap. Teknik ini dengan sempurna menggabungkan buffering respons dengan browser secara bertahap menampilkan data.
; Lebih sedikit baris dan respons panggilan. Lebar konten masing -masing sel.)
Keluhan umum lainnya tentang buffering respons adalah bahwa ia mengambil banyak memori server ketika halaman yang sangat besar diproduksi. Terlepas dari metode menghasilkan halaman besar, masalah ini juga dapat diselesaikan melalui penggunaan respons yang cerdik.
Tip 15: Batch Script Tertanam dan Respons. Pernyataan Penulisan
Sintaks VBScript < % = Ekspresi %> Tulis nilai "ekspresi" ke aliran output ASP. Jika penyangga respons tidak diaktifkan, setiap pernyataan yang dieksekusi akan menulis data ke browser di banyak paket kecil melalui jaringan. Ini sangat lambat. Selain itu, eksekusi yang diselingi sejumlah kecil skrip dan HTML akan menyebabkan peralihan antara mesin skrip dan HTML, sehingga mengurangi kinerja. Oleh karena itu, gunakan trik berikut: Gunakan respons. Panggilan penulisan alih -alih ekspresi inline yang dibundel dengan ketat. Misalnya, dalam contoh berikut, ada satu penulisan ke aliran respons per bidang per baris, dan ada banyak sakelar antara VBScript dan HTML per baris:
<able>
< % Untuk setiap FLD di rs.fields %>
<t th> < % = fld.name %> </th>
<%
Berikutnya
Sementara tidak rs.eof
%>
<tr>
< % Untuk setiap FLD di rs.fields %>
<td> < % = fld.Value %> </td>
<% Berikutnya
</tr>
<% rs.movenext
Pergi %>
</tabel>
Kode di bawah ini lebih efisien, dengan satu menulis ke aliran respons per baris. Semua kode terkandung dalam blok VBScript:
<able>
<%
Untuk setiap fld di rs.fields
Response.write (? <h>? & Fld.name &? </t>? & Vbcrlf)
Berikutnya
Sementara tidak rs.eof
Response.write (? <tr>?)
Untuk setiap FLD di rs.fields %>
Response.write (? <td>? & Fld.value &? </td>? & Vbcrlf)
Berikutnya
Response.write? </tr>?
Pergi ke
%>
</tabel>
Trik ini bekerja sangat baik ketika penyangga respons dinonaktifkan. Merupakan ide bagus untuk memungkinkan buffering respons dan melihat apakah batching response.write membantu meningkatkan kinerja.
(Dalam contoh khusus ini, loop bersarang yang membangun tubuh meja (walaupun tidak rs.eof ...) dapat diganti dengan panggilan getstring yang dibangun dengan cermat.)
Tip 16: Jika halaman membutuhkan waktu lama untuk menyelesaikan, Lakukan jika pengguna tidak sabar sebelum menggunakan respons
. Jika mereka mengklik Refresh atau pindah ke halaman lain di server, ada permintaan baru yang menunggu di akhir antrian permintaan ASP, dan permintaan terputus di tengah antrian. Ini sering terjadi ketika beban pada server tinggi (dan karena itu antrian permintaan panjang dan waktu respons lama), yang hanya membuat situasi lebih buruk. Tidak ada gunanya melaksanakan halaman ASP (terutama halaman ASP yang lambat, besar) jika pengguna tidak lagi terhubung. Anda dapat memeriksa ini menggunakan properti response.isclientConnected. Jika mengembalikan False, respons. UND harus dipanggil dan sisa halaman harus dibuang. Faktanya, IIS 5.0 telah diprogram dalam - setiap kali ASP akan melaksanakan permintaan baru, ia memeriksa berapa lama permintaan telah menunggu dalam antrian. Jika telah menunggu di sana selama lebih dari 3 detik, ASP akan memeriksa apakah klien masih terhubung, dan jika tidak, segera hentikan permintaan tersebut. Anda dapat menyesuaikan batas waktu dari 3 detik ke nilai lain menggunakan pengaturan aspqueueconnectiontesttime dalam metabase.
Anda juga dapat memeriksa respons. Ketika buffering respons diaktifkan, ada baiknya untuk melakukan respons. Bersibas dari waktu ke waktu untuk memberi tahu pengguna apa yang terjadi.
Perhatikan bahwa pada IIS 4.0, respons. Jika buffering diaktifkan, Anda juga harus melakukan respons. Pada IIS 5.0, tidak perlu melakukan ini - Response.isclientConnected berfungsi dengan baik. Bagaimanapun, respons. Pengalaman menunjukkan bahwa Anda tidak boleh menyebutnya setiap kali loop ketat dieksekusi, seperti ketika menampilkan banyak baris meja - menyebutnya setiap dua puluh atau lima puluh baris mungkin tepat.
Tip 17: Gunakan tag <pesope> untuk objek instantiated
jika Anda ingin merujuk objek yang tidak digunakan di semua jalur kode (terutama objek server atau aplikasi-scoped), gunakan tag <object runat = server = objname> tag> Deklarasi di Global.asa mereka alih -alih menggunakan metode server.CreateObject. Server.CreateObject segera membuat objek. Jika Anda tidak menggunakan objek di masa depan, Anda telah membuang sumber daya. Tag <objek id = objname> menyatakan objname, tetapi objname tidak dibuat sampai metode atau properti digunakan untuk pertama kalinya.
Ini adalah contoh lain dari evaluasi malas.
Tip 18: Gunakan deklarasi Typelib untuk ADO dan komponen lainnya
saat menggunakan ADO, pengembang sering menambahkan adovbs.txt untuk mengakses berbagai konstanta ADO. File ini harus dimasukkan dalam setiap halaman di mana konstanta akan digunakan. File konstan ini cukup besar, menambahkan banyak overhead ke waktu kompilasi dan ukuran skrip setiap halaman ASP.
IIS 5.0 memperkenalkan kemampuan untuk mengikat ke pustaka jenis komponen. Ini memungkinkan Anda untuk merujuk pustaka tipe sekali dan menggunakannya di setiap halaman ASP. Tidak ada overhead untuk menyusun file konstan untuk setiap halaman, dan pengembang komponen tidak perlu membuat vbscript#_include file untuk digunakan pada ASP.
Untuk mengakses ADO Typelib, tempatkan pernyataan berikut di Global.ASA.
<!- Metadata Name =? Microsoft Activex Data Objects 2.5 Perpustakaan?
Type =? Typelib?
Atau
<!- Tipe metadata =? Typelib?
Program
Files Common Files System Ado MSADO15.dll
? Layanan memberikan dukungan. Gunakan fitur -fitur ini bila memungkinkan. Semua teknologi ini melakukan validasi sisi klien dan caching data, menghilangkan kebutuhan untuk perjalanan pulang pergi ke server web. Jika Anda menjalankan browser pintar, browser dapat melakukan beberapa validasi untuk Anda (misalnya, memeriksa bahwa checksum kartu kredit valid sebelum melakukan posting). Gunakan fitur ini bila memungkinkan. Dengan mengurangi perjalanan bundar klien-server, Anda mengurangi beban di server web dan mengurangi lalu lintas jaringan (meskipun halaman pertama yang dikirim ke browser mungkin lebih besar) dan sumber daya back-end yang diakses oleh server. Selain itu, pengguna tidak harus membaca halaman baru seperti biasa, jadi pengguna merasa lebih baik. Melakukan hal ini tidak berarti Anda dapat melewatkan validasi sisi server-Anda harus selalu melakukan validasi sisi server juga. Ini mencegah klien dari menghasilkan data yang salah karena beberapa alasan (seperti peretas, atau browser yang tidak menjalankan rutinitas validasi sisi klien).
Banyak pekerjaan telah dilakukan untuk mengembangkan HTML "independen-browser". Karena kekhawatiran ini, pengembang enggan menggunakan fitur browser populer yang dapat meningkatkan kinerja. Untuk beberapa situs kinerja yang benar-benar tinggi, masalah "akses" browser harus diperhatikan, dan strategi yang baik adalah mengoptimalkan halaman untuk menyesuaikannya dengan browser populer. Kemampuan browser dapat dengan mudah dideteksi di ASP menggunakan komponen kemampuan browser. Alat seperti Microsoft FrontPage Bantuan Desain kode yang sesuai untuk browser dan versi spesifik HTML. Lihat kapan lebih buruk? Menimbang trade-off teknologi untuk diskusi lebih lanjut.
Tip 20: Hindari menggunakan gabungan string dalam satu loop
banyak orang membuat string dalam satu loop, seperti ini:
s =? <able>?
Untuk setiap fld di rs.fields
S = S &?
Selanjutnya
saat tidak rs.eof
S = S & VBCRLF &?
Untuk setiap fld di rs.fields
S = S &?
Berikutnya
S = S &?
rs.MoveNext
Wend
S = S & VBCRLF &? </boable>? & Vbcrlf
Respons.write s
Beberapa masalah muncul dengan pendekatan ini. Masalah pertama adalah bahwa string yang berulang kali membutuhkan waktu untuk kekuatan dua. Contoh yang lebih sederhana akan menggambarkan masalah ini dengan lebih jelas.
S = ??
Untuk i = ASC (? A?) Ke ASC (? Z?)
S = S & chr (i)
Berikutnya
Dalam iterasi pertama, Anda mendapatkan string satu karakter? A?. Dalam iterasi kedua, VBScript harus merealokasi string dan menyalin dua karakter (? AB?) Menjadi s. Pada iterasi ketiga, itu juga harus merealokasi S lagi dan menyalin tiga karakter ke s. Pada iterasi N (26), ia harus merealokasi dan menyalin karakter N menjadi s. Totalnya adalah 1+2+3+...+n, yaitu, n*(n+1)/2 salinan.
Dalam contoh rekaman di atas, jika ada 100 catatan dan 5 bidang, loop dalam akan dieksekusi 100*5 = 500 kali, dan waktu yang dihabiskan untuk semua penyalinan dan realokasi sebanding dengan 500*500 = 250.000. Ini terlalu banyak operasi salin untuk recordset berukuran sedang.
Dalam hal ini, kode dapat ditingkatkan dengan menggunakan response.write () atau inline skrip (< % = fld.value %>) alih -alih gabungan string. Jika buffering respons diaktifkan (seharusnya), ini akan lebih cepat karena respons. Menulis hanya menambahkan data ke akhir buffer respons. Tidak ada realokasi yang terlibat, jadi sangat efisien.
Dalam kasus spesifik mengonversi rekor ADO ke tabel HTML, Anda harus mempertimbangkan untuk menggunakan Getrows atau Getstring.
Jika Anda menggabungkan string dalam JScript, sangat disarankan untuk menggunakan += operator, yaitu, gunakan S +=? Sebuah string?
Kiat 21: Aktifkan browser dan caching proxy
secara default, ASP menonaktifkan caching di browser dan proxy. Ini masuk akal karena halaman ASP, pada dasarnya, dinamis, dengan informasi mendasar yang berubah dari waktu ke waktu. Jika halaman tidak memerlukan penyegaran pada setiap tampilan, Anda harus mengaktifkan browser dan caching proxy. Hal ini memungkinkan browser dan proksi untuk menggunakan salinan "cache" dari halaman untuk sejumlah waktu tertentu, yang panjangnya Anda dapat mengontrol. Caching dapat sangat mengurangi beban di server dan mempersingkat waktu tunggu pengguna.
Halaman dinamis mana yang dapat digunakan sebagai halaman untuk di -cache? Berikut adalah beberapa contoh:
Halaman Prakiraan Cuaca, di halaman ini, ramalan cuaca diperbarui setiap 5 menit.
Halaman Beranda Daftar Item Berita atau Rilis, Diperbarui dua kali sehari.
Daftar kinerja reksa dana di mana statistik dasar diperbarui setiap beberapa jam.
Perhatikan bahwa ketika browser atau caching proxy digunakan, jumlah kunjungan yang dicatat di server web dikurangi. Jika Anda ingin mengukur semua tampilan atau posting halaman secara akurat, Anda tidak ingin menggunakan browser dan caching proxy.
Caching browser dikendalikan oleh header "kedaluwarsa" HTTP, yang dikirim ke browser oleh server web. ASP menyediakan dua mekanisme sederhana untuk mengirim header ini. Untuk mengatur jumlah menit setelah itu suatu halaman akan kedaluwarsa, atur Properti Response.Expires. Contoh berikut memberi tahu browser bahwa konten kedaluwarsa dalam 10 menit:
<
% respons.
Pastikan untuk menggunakan angka negatif yang besar, seperti -1000 (sedikit lebih dari satu hari) untuk menghindari ketidaksesuaian antara jam server dan browser. Properti kedua, Response.ExpiresAbsolute, akan memungkinkan Anda mengatur waktu spesifik ketika konten akan kedaluwarsa:
< % response.expiresabsolute = #may 31.2001 13: 30: 15 # %>
Alih -alih menggunakan objek respons untuk mengatur waktu kedaluwarsa, Anda dapat menulis tag <meta> ke dalam html, biasanya di bagian <head> dari file HTML. Beberapa browser akan menghormati arahan ini, sementara proxy tidak akan.
<Meta http-equiv =? Nilai?
Akhirnya, Anda dapat menggunakan properti respons. Menetapkan properti ini ke "publik" memungkinkan proxy untuk menyimpan konten ini.
< % Response.cachecontrol =? Publik?
Secara default, properti ini diatur ke "Private". Perhatikan bahwa caching proxy tidak boleh diaktifkan untuk halaman yang menampilkan data khusus untuk pengguna, karena proxy dapat melayani halaman pengguna milik pengguna lain.
Tip 22: Gunakan server.Transfer alih -alih respons. Redirect bila memungkinkan
. Fungsi ini biasanya digunakan untuk mengarahkan pengguna ke halaman login atau kesalahan. Karena pengalihan memaksa permintaan untuk halaman baru, hasilnya adalah bahwa browser harus melakukan dua perjalanan pulang pergi ke server web, dan server web harus menangani satu permintaan lagi. IIS 5.0 memperkenalkan server fungsi baru. Transfer, yang mentransfer eksekusi ke halaman ASP lain di server yang sama. Ini menghindari perjalanan bundar browser-web-server yang berlebihan, meningkatkan kinerja sistem secara keseluruhan dan waktu respons pengguna. Periksa "arah baru" di "Redirect", itu harus server.transfer dan server.Execute.
Lihat juga memanfaatkan ASP di IIS 5.0 untuk daftar lengkap fitur baru di IIS 5.0 dan ASP 3.0.
Tip 23: Gunakan backslash di URL direktori
tip terkait adalah memastikan Anda menggunakan backslash (/) dalam URL yang menunjuk ke direktori. Jika Anda menghilangkan slash trailing, browser akan membuat permintaan ke server hanya untuk memberi tahu server bahwa ia meminta direktori. Browser membuat permintaan kedua, menambahkan tebasan ke URL, dan hanya kemudian server dapat merespons dengan dokumen default direktori atau daftar direktori (jika tidak ada dokumen default dan penjelajahan direktori diaktifkan). Menambahkan slash menghilangkan pengembalian pertama yang tidak berguna. Untuk memudahkan pengguna untuk membaca, tebasan trailing pada nama tampilan dapat dihilangkan.
Misalnya, tulis:
<a href =? Http: //msdn.microsoft.com/workshop/? Title =? Msdn web
Workshop?> Http://msdn.microsoft.com/workshop </a>
Ini juga berlaku untuk URL yang menunjuk ke halaman beranda di situs web: Gunakan yang berikut: <a href =? Http: //msdn.microsoft.com/?> Alih -alih <a href =? Http: //msdn.microsoft Com?>.
Tip 24: Hindari menggunakan variabel server
. Situasinya mirip dengan mencari file di folder di loteng apak. Ketika Anda ingin menemukan dokumen itu, Anda harus pergi ke loteng, menemukan foldernya, dan kemudian temukan dokumennya. Hal yang sama terjadi ketika Anda meminta variabel server - pertama kali Anda meminta variabel server, kinerja menderita. Permintaan selanjutnya ke variabel server lain tidak akan berdampak pada kinerja.
Jangan pernah mengakses objek permintaan yang tidak memenuhi syarat (misalnya, permintaan ("data")). Request.serverVariable disebut secara implisit untuk item yang tidak ada di request.cookies, request.form, request.querystring, atau request.clientCertificate. Koleksi Permintaan.Servaribles jauh lebih lambat daripada koleksi lainnya.
Tip 25: Meningkatkan ke komponen sistem terbaru dan terhebat
adalah konstan, dan kami sarankan Anda meningkatkannya ke konfigurasi terbaru dan terhebat. Yang terbaik adalah meningkatkan ke Windows 2000 (dan karena itu IIS 5.0, ADO 2.5, MSXML 2.5, Internet Explorer 5.0, VBScript 5.1, dan JScript 5.1). Pada komputer multiprosesor, menerapkan IIS 5.0 dan ADO 2.5 dapat secara signifikan meningkatkan kinerja. Di bawah Windows 2000, ASP berskala dengan baik untuk empat prosesor atau lebih, sedangkan di bawah IIS 4.0, ASP tidak skala di luar dua prosesor. Semakin banyak kode skrip dan basa yang Anda gunakan di aplikasi Anda, semakin banyak peningkatan kinerja yang akan Anda alami setelah meningkatkan ke Windows 2000.
Jika Anda belum dapat meningkatkan ke Windows 2000, Anda dapat meningkatkan ke versi terbaru SQL Server, ADO, VBScript dan JScript, MSXML, Internet Explorer, dan Paket Layanan NT 4. Mereka berdua meningkatkan kinerja dan keandalan.
Tip 26: Mengoptimalkan server web
ada berbagai parameter optimasi IIS yang dapat meningkatkan kinerja situs. Misalnya, dengan IIS 4.0, kami sering menemukan bahwa meningkatkan Parameter Asp ProcessorthReadMax (lihat dokumentasi IIS) dapat secara signifikan meningkatkan kinerja, terutama di situs yang cenderung menunggu sumber daya back-end (seperti database) atau produk perantara lainnya (tersebut sebagai sikat layar). Di IIS 5.0, Anda mungkin menemukan bahwa memungkinkan ASP Thread Gating lebih efisien daripada menemukan pengaturan optimal untuk AsppRocessorthReadmax, yang sekarang terkenal.
Untuk referensi yang baik, lihat mengoptimalkan IIS di bawah ini.
Pengaturan konfigurasi yang optimal tergantung pada, di antara faktor -faktor lain, kode aplikasi, perangkat keras sistem yang dijalankannya, dan beban kerja klien. Satu -satunya cara untuk menemukan pengaturan terbaik adalah dengan melakukan pengujian kinerja, yang akan kita bahas di tip berikutnya.
Tip 27: Melakukan pengujian kinerja
seperti yang telah kami katakan sebelumnya, kinerja adalah karakteristik. Jika Anda ingin meningkatkan kinerja situs Anda, tetapkan tujuan kinerja dan secara bertahap tingkatkan sampai Anda mencapainya. Tidak, tidak ada pengujian kinerja yang akan dilakukan. Seringkali, pada akhir proyek, sudah terlambat untuk membuat perubahan struktural yang diperlukan, dan klien Anda akan kecewa. Lakukan pengujian kinerja sebagai bagian dari rutinitas pengujian Anda. Anda dapat melakukan pengujian kinerja pada komponen individual secara individual, seperti halaman ASP atau objek COM, atau di situs secara keseluruhan.
Banyak orang menggunakan browser tunggal untuk meminta halaman untuk menguji kinerja situs web. Melakukan ini akan memberi Anda perasaan bahwa situs Anda responsif, tetapi itu tidak akan benar -benar memberi tahu Anda bagaimana kinerja situs Anda di bawah beban.
Biasanya, untuk menguji kinerja secara akurat, Anda memerlukan lingkungan pengujian khusus. Lingkungan ini harus mencakup perangkat keras yang mirip dengan lingkungan produksi dalam hal kecepatan prosesor, jumlah prosesor, memori, disk, konfigurasi jaringan, dll. Kedua, Anda harus menentukan beban kerja klien: berapa banyak pengguna simultan, seberapa sering mereka membuat permintaan, jenis halaman apa yang mereka klik, dll. Jika Anda tidak memiliki data tentang penggunaan situs yang sebenarnya, Anda harus memperkirakan penggunaan. Akhirnya, Anda memerlukan alat yang dapat mensimulasikan beban kerja klien yang diharapkan. Dengan alat -alat ini, Anda dapat mulai menjawab pertanyaan seperti "Jika saya memiliki dan pengguna simultan, berapa banyak server yang saya butuhkan?" Anda juga dapat mengidentifikasi penyebab bottleneck dan mengoptimalkannya.
Di bawah ini adalah beberapa alat pengujian beban web yang baik. Kami sangat merekomendasikan toolkit Microsoft Web Application Stress (WAS). Memungkinkan Anda untuk merekam skrip tes dan kemudian mensimulasikan ratusan atau ribuan pengguna yang mengakses server web. Adalah laporan sejumlah statistik, termasuk permintaan per detik, distribusi waktu respons, dan jumlah kesalahan. IS tersedia di antarmuka klien yang kaya dan antarmuka berbasis web yang memungkinkan Anda melakukan pengujian jarak jauh.
Pastikan untuk membaca panduan tuning IIS 5.0.
Tip 28: Baca Tautan Sumber Daya
di bawah ini adalah tautan ke beberapa sumber daya terkait kinerja yang hebat. Jika Anda ingin mempelajarinya, baca mengembangkan aplikasi web yang dapat diskalakan.
Optimalisasi Sumber Daya Asp Mengembangkan Aplikasi Web yang Dapat Dipahami Maudara
-Maudaraisasi
Kinerja Halaman Server Aktif Anda oleh Nancy Winnick Cluts
15 Detik: Bagian Kinerja
Meningkatkan Kinerja di ASP - Bagian I oleh Wayne Plourde
kapan lebih buruk?
,Kecepatan dan sumber daya optimisasi
oleh Nancy Winnick Cluts
,mengoptimalkan IIS
oleh Charles CarrollThe Art and Science of Web Server Tuning dengan Internet Information Services 5.0
Memanfaatkan ASP di IIS 5.0,
Tuning IIS 4.0 untuk situs volume tinggi oleh JD Meier, Tuning Informasi Internet Internet, Tuning Internet Informasi Internet Kinerja Server oleh Michael Stephenson
,menavigasi labirin pengaturan untuk optimasi kinerja server web
oleh Mike Moore
,Mengelola Internet Information Server 4.0 untuk kinerja oleh Todd Wanke,
ADO dan SQL Server
oleh Hans HugliTop Tips: Mengakses SQL melalui ADO
dan ASP,Meningkatkan Kinerja aplikasi MDAC Anda oleh
JD Meier
,mengumpulkan di komponen akses data Microsoft oleh Suresh Kannan,
SQL Server: tolok ukur kinerja dan panduan oleh
Leland Ahlbeck dan Don Willitsmeningkatkan kinerja komponen akses data dengan IIS 4.0,
komponen akses data Microsoft ( MDAC) dan Activex Data Objects (ADO) Kiat Kinerja oleh Leland Ahlbeck,
Microsoft
SQL Server 7.0 Tuning Kinerja Praktis - Perspektif Server oleh Leland Ahlbeck,
Microsoft SQL Server 7.0 Tuning Kinerja Praktis - Perspektif Server oleh Damien Lindauer - The Server 7.0 Perspektif Aplikasi oleh Damien Lindauer
Mengakses Rekaman Di Internet oleh Dino Esposito
Pedoman KomponenASP
oleh JD Meier
Q243548: Info: Pedoman Desain untuk Komponen VB di bawah
model
threading ASPyang dijelaskan oleh Nancy Winnick Cluts
So Happy Together
?Komponen server aktif dengan ATL oleh
Nancy Winnick Cluts
, Agility dalam komponen server oleh George Reilly,membangun komponen tingkat menengah berkinerja tinggi dengan C ++ oleh
Neil Allain
,halaman server aktif dan com oleh Jon Flanders Apartments, oleh Don Box,
House of Com: Halaman Server Aktif, oleh Don Box,
House of Com: Contexts, oleh Don Box,
House of Com: Pertukaran Kinerja Lingkungan Eksekusi Komponen Windows 2000, oleh Don Box,
Membangun Komponen COM yang memanfaatkan sepenuhnya Visual Basic dan Scripting , oleh Ivo Salmre
Prinsip Desain Komponen untuk
Komponen Kamus
MTSMembuat Objek Cache Halaman, oleh Robert Coleridge
Mengatasi Objek Kamus: Tim ASP Membuat Objek Lookup-Table, oleh Robert Carter
Caprock
Site Site Edition Commerce Edisi Kamus Kamus Komponen
Sesi Sesi
Kamus Carter CarterQ175167: howto: nilai yang bertahan tanpa sesi
Q157906: howto: bagaimana mempertahankan keadaan di halaman dengan
perilaku kegigihan berbasis vbscript XML memperbaiki sakit kepala pertanian web oleh aaron skonnard
house of com: program tanpa kewarganegaraan dengan kinerja don dan skalabilitascetak biru untuk membangun web untuk membangun web untuk membuat cetak blueprint
untuk membangun kotak untuk membuat kotak untuk membangun box farm
dan skalabilitas
untuk membangun box box forSitus Menggunakan Kinerja Server Platform DNA Microsoft Windows
dan Pembunuh Skalabilitas, oleh George Reilly
Microsoft Visual Studio Scalability Center
Fitch & Mather Stocks 2000
Menyetel aplikasi fmstocks
Aplikasi Visual Basic Kinerja Tinggi, oleh Ken Spencer
Duwamish Books, Fase 4
Top Windows DNA Kesalahan Kinerja Windows Top Windows DNA Top Windows Top Windows Windows Top Windows DNA DNA DNA Kesalahan DNA Top Windows Top Windows Top Dan bagaimana mencegah mereka oleh Gary Geiger dan Jon Pulsipher
Building dari statis HTML ke pertanian web berkinerja tinggi oleh Shawn Bice
Microsoft Web Application Stress Tool
Saya
tidak bisa cukup menekankannya-muat uji aplikasi ASP Anda, oleh JD Meier
Windows DNA
Acara PemantauanKit Kit Performance
dalam aplikasi terdistribusi menggunakan Visual Studio Analyzer, oleh Mai-Lan Tomsen
Bibliografi
Profesional Active Server Pages 3.0, WROX Press (terutama Bab 26: Mengoptimalkan Kinerja ASP, George Reilly dengan Matthew Gibbs).
Microsoft Internet Information Services 5.0 Panduan Sumber Daya (dengan Windows 2000 Server Resource Kit), Microsoft Press.
Kit Sumber Daya Server Informasi Internet Microsoft (untuk IIS 4.0), Microsoft Press.
Pemrograman Aplikasi Terdistribusi dengan COM dan Microsoft Visual Basic 6.0, oleh Ted Pattison, Microsoft Press.
Com yang efektif, oleh Don Box, Keith Brown, Tim Ewald, dan Chris menjual;
Mengembangkan kegunaan web: Praktik Kesederhanaan, oleh Jakob Nielsen, pengendara baru.
Situs web ASP
Technet untuk IIS
learnasp.com
4gUysfromrolla.com
15Seconds.com
asptoday.com
asp101.com
asplists.com. Banyak milis profesional meliputi:
Kode Cepat!
ASP maju
Bukan manajemen Newbiestate
Skalabilitas
Komponen Dasar Visual
Xml
Bangunan Komponen C ++/ATL
Useit.com: Kegunaan Web
Gaya ASP
Asp Praktik Terbaik Oleh George Reilly
Asp Cepat Pelajaran oleh Charles Carroll
Perencanaan untuk Asp John Meade
Asp GuidelinesXML
Oleh JD Meier
Di Dalam Kinerja XML oleh Chris Lovett
Di Dalam Kinerja MSXML oleh Chris Lovett