ASP は動的 Web ページを迅速に実行できますが、コードとデータベース接続を圧縮することで動的 Web ページの実行を高速化することもできます。これは、コードと ASP 機能を合理化して最速の実行速度を実現する方法に関する詳細な記事です。せっかちなユーザーにとって、ユーザー ボタンを押してから結果が画面に表示されるまでに遅延がある場合は、別のサイトを閲覧している可能性があります。商用サイトをお持ちの場合、これは潜在的な売上の損失を意味する可能性があります。
ユーザーの帯域幅を制御する方法はありませんが、ASP サイトを最適化することで最高のパフォーマンスを実現します。潜在的なパフォーマンスの向上のほとんどは、コードの強化ではなく、システムの変更によって行われます。システム効率の問題が発生した場合に、システム管理者にシステムのアップグレードを依頼するのは不適切な考えです。
まず、Asp のパフォーマンスに影響を与える要因は何でしょうか?残念ながら、多くの要因がありますか?これらはほんの一部です:
利用可能な帯域幅
サーバー上のプロセッサおよびその他のハードウェアの速度
サーバー上で実行されている他のプログラム (OpenGL スクリーン セーバーなど)
データベース接続モード、接続プール、データベース システム自体 (たとえば、Oracle は SQL Server よりも優れており、SQL Server は Access よりも優れています)
使用言語
ストアド プロシージャは行ベースの SQL ステートメントよりも優れています
VB や JavaScript の代わりにコンパイルされたコンポーネントを使用し、エラー処理などの優れた ASP プログラミング経験があること。
上記の要因の一部は、IIS の知識と経験を持つ開発者であればすでに一般的に認識されているかもしれませんが、その他の要因は開発者にとって非常に複雑な問題である可能性があります。この記事では、Asp* のパフォーマンスに影響を与えるすべての要因を説明し、数ミリ秒の短縮で実行できる主な処理を見ていきます。
ASPスクリプトのサイズ
スクリプト ページ (および他のページ) が必要以上に長すぎませんか?これは、実行されるとすぐに Asp* のパフォーマンスを低下させるものです。 ASP スクリプトは情報の取得や出力の書式設定に役立ちますが、スクリプトは 1 行ずつ解釈されるため、スクリプトが長いほど実行にかかる時間も長くなります。
スクリプトが巨大な場合、その長さを減らすにはどうすればよいでしょうか?以下にいくつかの提案を示します。
高度な Windows プログラミング言語または適切な COM インターフェイス言語を使用して、それらをサーバー側コンポーネント、つまり VB DLL またはコンパイルされていないコンポーネントに変換できますか?そしてサーバー側に登録します。クイックガイドは次の場所にあります。
http://www.webdevelopersjournal.com/articles/activex_for_asp.html にあります。適切に作成された ActiveX コンポーネントをコンパイルすると、パフォーマンスが大幅に向上するだけでなく、特に ASP サイトをサードパーティのホストに公開する場合に、ソフトウェア (スクリプト) を保護することもできます。
スクリプトは 1 行ずつ解釈されるため、冗長なスクリプトを削除するか、より効率的なスクリプトを作成することでパフォーマンスを向上させることができます。単一の ASP ファイルに数百行のコードがある場合、おそらくこの方法でユーザー、トランザクション、データ サービスを適切に分離できます。実際、これを実行すると、冗長なコードが見つかる可能性があります。複数のテーブルを出力する必要がある場合は、テーブルを出力する一般的な関数を作成し、それを複数回呼び出すだけです。
Asp スクリプトのサイズについて話すときは、含まれるファイルのサイズについて言及する必要があります。インクルード ファイルを使用すると、インクルード ファイル全体が読み込まれます。これは、コードのその部分を Asp ファイル自体に記述することと同じです。したがって、長いインクルード ファイルに多くの一般的なメソッドと定義を定義する場合は、ファイルをインクルードすると、そのファイル内のすべてのメソッドまたは定義を使用するかどうかにかかわらず、ロードされるファイル全体にインクルードされることを理解してください。 ASP はすべての拡張コードをキャッシュするため、検索効率が低下します。この場合、インクルードされたファイルをより小さなモジュール形式のファイルに分割する必要があります。また、インクルード ファイルはサーバーによって別のページ リクエストとして扱われるため、インクルード ファイルを使用しすぎるとダウンロード時間に影響する可能性があることも理解してください。
<!-- #include file=Header.asp -->
<!-- #include file=Footer.asp -->
<SCRIPT言語=vbscript runat=サーバー>
サブメイン()
書き込みヘッダー
書き込み本文
フッターの書き込み
エンドサブ
サブライトボディ()
...
エンドサブ
Main?' プロシージャ Main を呼び出します
</スクリプト>
スクリプトが長い場合は、Response.IsClientConnected を使用してください。これは、クライアントがサーバーに接続されなくなったときに、サーバー CPU がループで待機することを回避できることを意味します。
<%
'クライアントがまだ接続されているかどうかを確認します
Response.IsClientConnected ではない場合
' まだ接続中です、ハンドラー
それ以外
'切断する
終了の場合
%>
ASP と HTML の混在
みんなこれやってるの?テーブルを出力するときに、ASP コードと HTML コードの間で変換を行いますが、これは悪い習慣です。例えば:
<HTML>
<ボディ>
<%
MyConn = Server.CreateObject(ADODB.Connection) を設定します。
MdbFilePath = Server.MapPath(sample.mdb)
MyConn.Open Driver={Microsoft Access Driver (*.mdb)}; DBQ= & MdbFilePath & ;
SQL_query = SELECT * 友達から
RS = MyConn.Execute(SQL_query) を設定します
RS.EOFではないが
%>
<LI><%=RS(名前)%>: <A HREF=>ホームページ</A>
<%
RS.MoveNext
ウェンド
%>
</BODY>
</HTML>
もう 1 つの一般的な例は、IF ステートメントを使用する場合です。
<%
セッション(DBOpen)でない場合は、
%>
<H1>データベースが接続されていません</H1>
<%
それ以外
%>
<H1>データベースオープン</H1>
<%
終了の場合
%>
このような場合、サーバー側スクリプトを一緒に記述し、Response.write を使用して HTML コードを生成することで、スクリプトのパフォーマンスを向上させることができます。例えば:
<%
セッション (DBOpen) でない場合は、
Response.Write <H1>データベースが接続されていません</H1>
それ以外
Response.Write <H1>データベースオープン</H1>
終了の場合
%>
大規模なスクリプトや多数のスクリプトの場合、パフォーマンスの向上が見られます。パフォーマンスを向上させるために、スクリプトの実行時に ASP が文字の Ascii コードを計算する必要がないように、<% タグの使用はできるだけ避けてください。
セッションステータス
セッションを通じて特定の状態を維持できる機能が ASP の非常に強力な機能であることは疑いの余地がありません。ただし、パフォーマンスに影響を与える可能性があります*。明らかに、セッションの使用を制限すると、サイトのスケーラビリティが別の問題になります。ただし、セッションはユーザーごとにサーバー リソースを消費します。
セッション変数を使用しない場合、または実際に使用する必要がない場合はどうすればよいでしょうか?非表示のフォームフィールドを使用したり、データベースにデータを保存したり、クエリ文字列を使用したりするのがコツですか?したがって、セッション状態を無効にする必要があります。次のステートメントを使用してセッションの使用を無効にできます。
@EnableSessionState = False
このようにして、ASP はセッション情報をチェックしなくなります。
セッション状態に依存する必要がある場合は、セッション オブジェクトに大量のデータを保存しないようにする必要があります。 IIS のセッションは、クライアントの HTTP Cookie が利用可能な限り維持されるため、セッションが終了するかタイムアウトになるまで、セッションによって占有されるメモリが占有されます。このように、多くのユーザーがプログラムを同時に使用すると、サーバー リソースが枯渇する可能性があります。
データベースアクセス
データベースへのアクセスは必須ですか?データベースにアクセスするとアプリケーションの速度が大幅に低下しますが、データベースがなければ多くのサイトが役に立たないことは明らかです。ただし、埋め込み SQL ステートメントを使用する代わりにストアド プロシージャを介してデータベースにアクセスすることで、潜在的なパフォーマンスを向上させることができます。また、ストアド プロシージャと ActiveX データ オブジェクト (ADO) を使用することにより、優れた柔軟性* も備えています。可能な限り、ストアド プロシージャからデータを出力します。
データベースにインデックスがあることを確認してください。これにより、プログラムの効率が直接向上します。また、データベース サーバーで統計情報の更新を実行して、データの分布を追跡し、データベースがこの情報に基づいてクエリの実行を変更できるようにしてください。 MS Access などの一部のデータベースはエンタープライズ レベルのプログラムで実際に使用できることに注意してください。 SQL Sever 7.0 または Oracle を選択することをお勧めします。
SQL がデータのカウント、結合、並べ替え、グループ化を行うように設計されたとおりに機能するようにします。これらのことを行うためのクエリ ステートメントを作成できる場合は、他の言語で自分で実行しないでください。
すべての列をカウントする最も簡単な構文は次のとおりです。
SELECT count(*) FROM パブリッシャー WHERE state='NY'
特定の列をカウントする場合は、group by ステートメントを使用してその列をグループ化する必要があります。そうしないと機能しません。
発行者から数(都市)、都市を選択 GROUP BY city
返される分類されたデータ:
SELECT * FROM テーブル名 WHERE フィールド名>50 OR フィールド名<100 ORDER BY フィールド名2, フィールド名3
データベースへの接続に Odbc またはファイル DSN を使用しますか? DSN 接続を使用する代わりに、高速 OLEDB プロバイダー テクノロジを使用してデータベースに接続します。 ISP (またはデータベース管理者/ネットワーク管理者) にシステム DSN のセットアップを依頼する必要はなくなり、Web ファイルを移動するときに構成を変更する必要もありません。
OLEDB は、ODBC レイヤーとアプリケーションの間に位置します。 ADO は、ASP ページの ODEDB の上にあるアプリケーションです。 ADO 呼び出しは、まず OLEDB に送信され、次に ODBC レイヤーに送信されます。ただし、OLEDB レイヤーに直接接続することもでき、その場合はサーバー側のパフォーマンスが向上します。ただし、OLEDB に直接接続するにはどうすればよいでしょうか?
SQLServer 7 を使用している場合は、次の接続コードを使用してデータベースに接続します。
strConnString = DSN='';DRIVER={SQL サーバー};
UID=myuid;PWD=mypwd;
DATABASE=MyDb;SERVER=MyServer;
最も重要なパラメータは DRIVER= の部分です。 ODBC をバイパスし、OLEDB (より高速な接続) を使用して SQL Server に接続する場合は、次の構文を使用します。
strConnString =プロバイダ=SQLOLEDB.1;パスワード=私のパスワード;
永続セキュリティ情報=True;ユーザーID=myuid & _
初期カタログ=mydbname;
データソース=myserver;接続タイムアウト=15
何か問題がありますか?
ここで、この新しい接続方法のポイントは何でしょうか?と疑問に思われるかもしれません。標準の DSN レス/システム DSN アプローチを使用してみてはいかがでしょうか? Wrox 氏の著書『ADO 2.0 Programmer's Reference』のテスト結果によると、OLEDB 接続と DSN または DSN レスの接続方法を比較すると、次のような改善点が見られます。
*比較できるもの:
SQLアクセス
OLEDBDSNNOLEDBDSN
接続時間: 18?82?接続時間: 62?99
1,000 レコードのクエリにかかる時間: 29005400 1,000 レコードのクエリにかかる時間: 100950
注: この結果は、Wrox の書籍『ADO 2.0 Programmer's Reference』の 232 および 233 ページに記載されています。時間はミリ秒単位で測定され、1,000 レコードまでのクエリ時間はサーバー側のカーソルを使用して計算されます (クライアント側のカーソルを使用した場合、OLEDB レコードセットと DSN レコードセットのパフォーマンスに大きな違いはありません)。
ASP デコードの問題:
HTTP ラウンドトリップ リクエストの数を減らすために、可能な限りクライアント側でユーザー入力を検証します。ブラウザに JavaScript またはその他のスクリプトをサポートする機能がある場合は、その機能を利用してサーバー リソースをさらに解放してください。
次の VBScript はクライアント ブラウザで実行され、サーバーに送信する前にユーザー情報を検証します。
<スクリプト言語=VBScript>
<!--
サブボタンEnter_OnClick
ディムザフォーム
TheForm = Document.MyForm を設定します。
If IsNumeric(TheForm.Age.Value) then
TheForm.submit
それ以外
Msgbox 年齢を数字で入力してください。
次の場合に終了
エンドサブ
//-->
</スクリプト>
<FORMmethod=POST name=MyFormaction=myfile.asp> 名前: <INPUT typr=text name=名前>
年齢:<INPUT type=text name=年齢>
<INPUT種類=ボタン名=btnEntervalue=Enter>
</フォーム>
ローカル変数を使用し、グローバル変数を避けてください。名前ドメイン全体を検索する必要がないため、Asp スクリプト エンジンはローカル変数にグローバル変数よりも高速にアクセスします。配列定義の変更は避けてください。最初の初期化時に十分なサイズを単純に割り当てる方が効率的です。この場合、メモリを多少浪費する可能性がありますが、速度という利点が得られます。この手法は、サーバーの負荷が高い場合に明らかに効果的です。
必ずしも使用されないオブジェクトを参照する必要がある場合は、Server.CreateObject メソッドを使用する代わりに <OBJECT> タグを使用することをお勧めします。 Server.CreateObject を使用すると、オブジェクトはすぐに作成されます。これに対して、<OBJECT> タグは、<object> でオブジェクトを定義した後にオブジェクトを使用しない場合、リソースを無駄にします。
例: 次の例では、<OBJECT> タグを使用して、アプリケーション スコープのアドバタイジング ホイール Ad Rotator オブジェクト実装を作成します。
例:
<OBJECT runat=serverscope=Application id=MyAds progid=MSWC.AdRotator>
</オブジェクト>
Ad Rotator オブジェクトをアプリケーションに保存すると、次の構文を使用して任意のプログラム ページでオブジェクトにアクセスできます。
<%=MyAds.GetAdvertising(CustomerAds.txt) %>
「オプション明示」スイッチをオンにします。 VB および VBScript では、明示的に宣言しなくても変数を使用できます。ただし、このオプションをオンにすると、変数を識別して定義できるため、変数を適切に書き込むことができ、パフォーマンスの向上に役立ちます。未定義のローカル変数は、変数を作成する前に名前空間を検索して変数が存在するかどうかを確認する必要があるため、速度が遅くなります。それを取り除き、すべての変数を明確に定義します (最初に定義し、後で使用します)。
これは良い習慣であり、タイプミスを防ぐことができ、処理も速くなります。
本当に使用する必要がない限り、Server.MapPath メソッドを使用しないでください。実際のパスがわかっている場合は、それを使用します。 MapPath を使用するには、IIS が現在のサーバー パスを取得する必要があります。これは、特別な要求をサーバーに送信する必要があることを意味し、パフォーマンスが低下することを意味します。もう 1 つの方法は、パスをローカル変数に保存し、必要なときにそれを使用することで、サーバーが何度も検索する必要がなくなります。
調子を確認してください
システム パフォーマンス モニター、netMon、PerfMon などのツールを使用してシステム パフォーマンスを測定できます。 Web* パフォーマンスをテストするには、WCAT (Web Capacity Analysis Tool) を使用できます。 WCAT を使用すると、IIS サーバーとネットワーク構成がさまざまなクライアント要求、データ、または HTML ページに応答する能力をテストできます。これらのテスト結果は、サーバーとネットワーク構成を最適化するためのガイダンスとして使用できます。 WCAT は、Windows 2000 (または Windows NT) および IIS のインターネット サービスが応答できる顧客のワークロードの量を見積もるように特別に設計されています。
(シミュレーション)。詳細については、「IIS リソース キット」を参照してください。 MSDN オンライン Web sokshop サイトには、ダウンロード リンクが付いた長い WCAT ユーザー ガイドもあります。 Asp* 機能について真剣に考えている場合は、必ずこのツールを入手してください。
アプリケーションのパフォーマンスの最適化に努めると、Web アプリケーションがよりスムーズに実行されます。本当に必要がない場合は、サーバーのパフォーマンスに影響を与えません。
ASP はストアド プロシージャを使用してデータ ページングを実装します
1. テーブルtiku_koushiを作成する
存在する場合 (select * from dbo.sysobjects where id =
object_id(N'[dbo].[tiku_koushi]') および OBJECTPROPERTY
(id, N'IsUserTable') = 1)
ドロップテーブル [dbo].[tiku_koushi]
行く
CREATE TABLE [dbo].[tiku_koushi] (
[id] [int] IDENTITY (1, 1) NOT NULL、
[タイトル] [varchar] (250) COLLATE
Chinese_PRC_CI_AS NULL 、
[list2_id] [char] (10) COLLATE
Chinese_PRC_CI_AS NULL
) [プライマリ] オン
行く
2. ストアド プロシージャ sp_c
CREATE プロシージャ sp_c
@テーブル名 varchar(50)、
@title varchar(250)、
@list2_id varchar(50)
として
if @tablename='tiku_koushi'
select count(*) from tiku_koushi where title like '%'+@title+'%' and list2_id=@list2_id
行く
3. ストアド プロシージャ sp_search_tiku
プロシージャの作成 sp_search_tiku
@テーブル名 varchar(50)、
@title varchar(250)、
@list2_id varchar(10)、
@pagesize int、
@page int
として
if @tablename='tiku_koushi'
始める
@ks int を宣言する
@str varchar(200) を宣言します
set @ks=@pagesize*(@page-1)
存在しない場合 (select * from dbo.sysobjects where id = object_id(N'[dbo].[temp_table91]') および OBJECTPROPERTY(id, N'IsUserTable') = 1)
始める
select * into temp_table91 from tiku_koushi ここで
タイトルは '%'+@title+'%' のようなもので、list2_id=@list2_id の順序になります。
ID の説明による
行数を設定 @pagesize
set @str='select * from temp_table91 where id not in
(temp_table91 から先頭の '+str(@ks)+' ID を選択します)'
実行(@str)
テーブル temp_table91 を削除します
終わり
終わり
行く
4.search_koushi.asp
<!-- #include file=conn.asp -->
<%
行=6
if request(page)= then
ページ=1
それ以外
page=リクエスト(ページ)
終了する場合
ページ<1 の場合
ページ=1
終了する場合
title=trim(リクエスト(タイトル))
list2_id=trim(リクエスト(list2_id))
set rs2=conn.execute(sp_c 'tiku_koushi','&title&','&list2_id&')
ページカウント=CInt(rs2(0)/行)
if(CInt(rs2(0)) mod line)=0 then
ページ数=ページ数
それ以外
ページ数=ページ数+1
終了する場合
if CInt(page)>=pagecount then
page=CInt(ページ数)
終了する場合
str=
str=str&page=&page&&title=&title&&list2_id=&list2_id
set rs=conn.execute
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(page)&')
もし rs.eof なら
応答。レコードを書き込みません
それ以外
%>
<html>
<頭>
<スタイルタイプ=テキスト/css>
td{font-size:12px;}
a{テキスト装飾:なし;}
</スタイル>
<スクリプト言語=javascript>
</script>
</head>
<本文>
<テーブル幅=518 ボーダー=1 ボーダーカラーライト=000000
ボーダーカラーダーク=#ffffff
align=center cellpadding=0 cellpacing=0>
<!--DWLayoutTable-->
<tr bgcolor=#dfdfdf>
<td width=454 align=center height=24 valign=middle>口頭試験の質問</td>
<td width=63 align=center valign=middle>削除</td>
</tr>
<% rs.eof まで実行します %>
<tr height=22>
<td valign=middle>·<a href=void(0)
onclick=window.open('editkoushi.asp?id=<%=rs(id)%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','' ,'幅=518
高さ=160 左=100')>
<%=rs(title)%></a></td>
<td align=center valign=middle>削除</td>
</tr>
<%
rs.movenext
ループ
%>
<tr align=left valign=middle bgcolor=efeff6
高さ=22>
<td Colspan=2 style=padding-left:6px;>
<a href=search_koushi.asp?page=<%=1%>&title=<%=title%>&list2_id=<%=list2_id%>>ホームページ</a> <a
href=search_koushi.asp?page=<%=page-1%>&title=<%=title%>&list2_id=<%=list2_id%>>前のページ</a> <a
href=search_koushi.asp?page=<%=page+1%>&title=<%=title%>&list2_id=<%=list2_id%>>次のページ</a> <a
href=search_koushi.asp?page=<%=pagecount%>&title=<%=title%>&list2_id=<%=list2_id%>>最後のページ</a>
合計 <%=pagecount%> ページ 現在のページは <%=page%>/<%=pagecount%> ページです。
合計 <%=rs2(0)%> レコードがあります</td>
</tr>
</テーブル>
</body>
</html>
<%
rs2.close
rs2=何も設定しない
rs.close
rs=何も設定しない
終了する場合
%>