ASP는 동적 웹 페이지를 빠르게 실행할 수 있지만 코드와 데이터베이스 연결을 압축하여 더 빠르게 실행할 수도 있습니다. 가장 빠른 실행 속도를 얻기 위해 코드와 ASP 기능을 간소화하는 방법에 대한 자세한 기사입니다. 참을성이 없는 사용자의 경우 사용자 버튼을 누른 후 화면에 결과가 나타나는 사이에 지연이 발생하면 다른 사이트를 탐색하고 있다는 의미일 수 있습니까? 상업용 사이트가 있는 경우 이는 잠재적인 판매 손실을 의미할 수 있습니다.
사용자의 대역폭을 제어할 수 있는 방법은 없지만 ASP 사이트를 최적화하여 최고의 성능을 얻습니다. 잠재적인 성능 향상의 대부분은 코드 강화보다는 시스템 변경을 통해 이루어집니다. 시스템 효율성 문제가 발생한 경우 시스템 관리자에게 시스템 업그레이드를 요청하는 것은 부적절한 생각입니다.
첫째, Asp의 성능에 영향을 미칠 수 있는 요소는 무엇입니까? 불행히도 많은 요인이 있습니까? 다음은 그중 일부입니다.
사용 가능한 대역폭
서버의 프로세서 및 기타 하드웨어 속도
서버에서 실행되는 다른 프로그램(예: OpenGL 화면 보호기!)
데이터베이스 연결 모드, 연결 풀, 데이터베이스 시스템 자체(예: Oracle은 SQL Server보다 우수하고 SQL Server는 Access보다 우수함)
사용된 언어
저장 프로시저는 행 기반 SQL 문보다 우수합니다.
VB 또는 JavaScript 대신 컴파일된 구성 요소를 사용하고 오류 처리 등과 같은 우수한 ASP 프로그래밍 경험을 사용하십시오.
위의 요소 중 일부는 IIS에 대한 지식과 경험이 있는 개발자가 이미 일반적으로 알아차릴 수 있지만 다른 요소는 매우 복잡한 문제일 수 있습니다. 이 기사에서는 Asp*의 성능에 영향을 미치는 모든 요소를 설명하고 몇 밀리초 내에 수행할 수 있는 주요 작업을 살펴보겠습니다.
ASP 스크립트 크기
스크립트 페이지(및 기타 페이지)가 필요 이상으로 깁니다. 이는 실행되자마자 Asp* 성능을 저하시키는 것입니다. ASP 스크립트는 정보를 얻고 출력 형식을 지정하는 데 유용하지만 스크립트는 한 줄씩 해석되므로 스크립트가 길수록 실행하는 데 더 오랜 시간이 걸립니다.
스크립트가 큰 경우 길이를 줄이기 위해 무엇을 할 수 있습니까? 다음은 몇 가지 제안 사항입니다.
고급 Windows 프로그래밍 언어나 적절한 COM 인터페이스 언어를 통해 서버 측 구성 요소, 즉 VB DLL로 변환하거나 컴파일되지 않은 구성 요소로 변환할 수 있습니까? 그리고 서버 측에 등록하십시오. 빠른 가이드는 다음에서 찾을 수 있습니다.
http://www.webdevelopersjournal.com/articles/activex_for_asp.html에서 찾을 수 있습니다. 잘 작성된 ActiveX 구성 요소를 컴파일하면 성능이 크게 향상될 뿐만 아니라 특히 ASP 사이트를 타사 호스트에 게시할 때 소프트웨어(스크립트)를 보호할 수 있습니다.
스크립트는 한 줄씩 해석되므로 중복되는 스크립트를 제거하거나 보다 효율적인 스크립트를 만들어 성능을 향상시킬 수 있습니다. 단일 ASP 파일에 수백 줄의 코드가 있는 경우 이 방법을 사용하면 사용자, 트랜잭션 및 데이터 서비스를 훌륭하게 분리할 수 있습니다. 실제로 이렇게 하면 중복된 코드가 발견될 수 있습니다. 여러 테이블을 출력해야 하는 경우 일반 함수를 작성하여 테이블을 출력하고 여러 번 호출하면 됩니다.
Asp 스크립트의 크기에 관해 이야기할 때 포함된 파일의 크기를 언급해야 합니다. 포함 파일을 사용하면 전체 포함 파일이 로드됩니다. 포함 파일이 포함되면 Asp 파일 자체에 코드의 해당 부분을 작성하는 것과 같습니다. 따라서 긴 포함 파일에 많은 공통 메서드와 정의를 정의하는 경우 파일을 포함할 때 모든 메서드나 정의를 사용하려는지 여부에 관계없이 전체 파일에 포함된다는 점을 이해하세요. ASP는 모든 확장 코드를 캐시하므로 검색 효율성이 떨어집니다. 이 경우 포함된 파일을 더 작은 모듈식 파일로 분할해야 합니다. 또한 포함 파일은 서버에서 별도의 페이지 요청으로 처리되며 포함 파일을 너무 많이 사용하면 다운로드 시간에 영향을 줄 수 있다는 점을 이해하십시오.
<!-- #include 파일=Header.asp -->
<!-- #include 파일=Footer.asp -->
<SCRIPT 언어=vbscript runat=서버>
서브메인()
쓰기헤더
쓰기바디
바닥글 쓰기
서브 끝
하위쓰기바디()
...
서브 끝
메인?'통화절차 메인
</스크립트>
스크립트가 길면 Response.IsClientConnected를 사용하세요. 이는 클라이언트가 더 이상 서버에 연결되어 있지 않을 때 서버 CPU가 루프 대기를 방지할 수 있음을 의미합니다.
<%
'클라이언트가 아직 연결되어 있는지 확인하세요.
Response.IsClientConnected가 아닌 경우
'아직 연결되어 있습니다, 핸들러님
또 다른
'연결 끊기
종료 조건
%>
ASP와 HTML의 혼합
다들 이렇게 하시나요? 테이블을 출력할 때 ASP와 HTML 코드 사이를 변환하는데 이는 나쁜 습관입니다. 예를 들어:
<HTML>
<바디>
<%
MyConn = Server.CreateObject(ADODB.Connection) 설정
MdbFilePath = Server.MapPath(샘플.mdb)
MyConn.Open 드라이버={Microsoft Access 드라이버(*.mdb)};
SQL_query = SELECT * 친구로부터
RS = MyConn.Execute(SQL_query) 설정
RS.EOF가 아닌 동안
%>
<LI><%=RS(이름)%>: <A HREF=>홈페이지</A>
<%
RS.이동다음
향하게 하다
%>
</BODY>
</HTML>
또 다른 일반적인 예는 IF 문을 사용할 때입니다.
<%
세션(DBOpen)이 아닌 경우
%>
<H1>데이터베이스가 연결되지 않았습니다</H1>
<%
또 다른
%>
<H1>데이터베이스 오픈</H1>
<%
종료 조건
%>
이러한 경우 서버 측 스크립트를 함께 작성하고 Response.write를 사용하여 HTML 코드를 생성하면 스크립트 성능을 향상시킬 수 있습니다. 예를 들어:
<%
세션(DBOpen)이 아닌 경우
응답.쓰기 <H1>데이터베이스 연결 안됨</H1>
또 다른
응답.쓰기 <H1>데이터베이스 오픈</H1>
종료 조건
%>
대규모 스크립트 및 다수의 스크립트의 경우 성능이 향상됩니다. 성능을 향상시키기 위해 <% 태그의 사용은 가능한 한 피합니다. ASP는 스크립트를 실행할 때 문자의 Ascii 코드를 계산할 필요가 없습니다.
세션 상태
세션을 통해 특정 상태를 유지하는 기능이 ASP의 매우 강력한 기능이라는 점에는 의심의 여지가 없습니다. 그러나 이는 귀하의* 성과에 영향을 미칠 수 있습니다. 분명히 세션 사용을 제한하면 사이트의 확장성은 또 다른 문제가 됩니다. 그러나 세션은 각 사용자의 서버 리소스를 소비합니다.
세션 변수를 사용하지 않거나 실제로 사용할 필요가 없다면 어떻게 될까요? 숨겨진 양식 필드를 사용하고, 데이터베이스에 데이터를 저장하고, 쿼리 문자열을 사용하고 있습니까? 따라서 세션 상태를 비활성화해야 합니다. 다음 명령문을 사용하여 세션 사용을 비활성화할 수 있습니다.
@EnableSessionState = 거짓
이러한 방식으로 ASP는 더 이상 세션 정보를 확인하지 않습니다.
세션 상태에 의존해야 하는 경우 세션 개체에 많은 양의 데이터를 저장하지 않아야 합니다. IIS의 세션은 클라이언트의 HTTP 쿠키를 사용할 수 있는 한 유지되므로 세션이 종료되거나 시간 초과될 때까지 세션이 차지하는 메모리가 차지하게 됩니다. 이런 식으로 많은 사용자가 동시에 프로그램을 사용하면 서버 리소스가 고갈될 수 있습니다.
데이터베이스 접근
데이터베이스 액세스는 필수인가요? 데이터베이스에 액세스하면 애플리케이션 속도가 크게 느려지지만 분명히 많은 사이트는 데이터베이스 없이는 쓸모가 없습니다. 그러나 내장된 SQL 문을 사용하는 대신 저장 프로시저를 통해 데이터베이스에 액세스하면 잠재적인 성능을 높일 수 있습니다. 또한 저장 프로시저와 ADO(ActiveX Data Objects)를 사용하여 뛰어난 유연성*을 제공합니다. 가능하면 저장 프로시저에서 데이터를 출력하세요.
데이터베이스에 인덱스가 있는지 확인하세요. 이렇게 하면 프로그램 효율성이 직접적으로 향상됩니다. 또한 데이터베이스가 이 정보를 기반으로 쿼리 실행을 수정할 수 있도록 데이터 배포를 추적하는 데 도움이 되도록 데이터베이스 서버에서 통계 업데이트를 실행해 보세요. MS Access와 같은 일부 데이터베이스는 엔터프라이즈 수준 프로그램에서 실제로 허용됩니다. SQL Sever 7.0이나 Oracle이 더 나은 선택입니다.
SQL이 데이터 계산, 조인, 정렬 및 그룹화를 위해 설계된 대로 작동하도록 하십시오. 이러한 작업을 수행하기 위해 쿼리 문을 작성할 수 있다면 다른 언어로 직접 작성하지 마세요.
다음은 모든 열의 개수를 계산하는 가장 간단한 구문입니다.
상태='NY'인 출판사에서 SELECT 개수(*)
특정 열을 계산하는 경우 group by 문을 사용하여 해당 열을 그룹화해야 합니다. 그렇지 않으면 작동하지 않습니다.
SELECT 개수(도시), 도시 FROM 게시자 GROUP BY 도시
반환된 분류된 데이터:
SELECT * FROM TableName WHERE FieldName>50 OR FieldName<100 ORDER BY FieldName2, 필드 이름3
Odbc 또는 파일 DSN을 사용하여 데이터베이스에 연결하시겠습니까? DSN 연결을 사용하는 대신 빠른 OLEDB 공급자 기술을 사용하여 데이터베이스에 연결합니다. 더 이상 ISP(또는 데이터베이스 관리자/네트워크 관리자)에게 시스템 DSN 설정을 요청할 필요가 없으며 웹 파일을 이동할 때 구성이 변경되지 않습니다.
OLEDB는 ODBC 계층과 애플리케이션 사이에 위치합니다. ADO는 ASP 페이지의 ODEDB 위에 있는 응용 프로그램입니다. ADO 호출은 먼저 OLEDB로 전송된 다음 ODBC 레이어로 전송됩니다. 그러나 OLEDB 레이어에 직접 연결할 수 있으며, 그렇게 하면 서버 측 성능이 향상됩니다. 그런데 OLEDB에 직접 연결하는 방법은 무엇입니까?
SQLServer 7을 사용하는 경우 다음 연결 코드를 사용하여 데이터베이스에 연결합니다.
strConnString = DSN='';DRIVER={SQL 서버} & _
UID=myuid;PWD=mypwd;
데이터베이스=MyDb;SERVER=내서버;
가장 중요한 매개변수는 DRIVER= 부분입니다. ODBC를 우회하고 OLEDB(더 빠른 연결)를 사용하여 SQL Server에 연결하려면 다음 구문을 사용하십시오.
strConnString =공급자=SQLOLEDB.1;비밀번호=mypassword;
보안 정보 유지=True;사용자 ID=myuid;
초기 카탈로그=mydbname & _
데이터 소스=myserver;연결 시간 초과=15
뭔가 문제가 있나요?
이제 여러분은 이 새로운 연결 방법의 요점이 무엇인지 궁금할 것입니다. 표준 DSN 없는/시스템 DSN 접근 방식을 사용하지 않는 이유는 무엇입니까? Wrox의 저서 "ADO 2.0 Programmer's Reference"에 나온 테스트 결과에 따르면 OLEDB 연결을 DSN 또는 DSN 없는 연결 방법과 비교하면 다음과 같은 개선 사항을 확인할 수 있습니다.
*비교 가능:
SQL 액세스
OLEDBDSNOLEDBDSN
연결 시간: 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>
<!--
하위 btnEnter_OnClick
DimTheForm
TheForm = Document.MyForm 설정
If IsNumeric(TheForm.Age.Value) 그러면
TheForm.제출
또 다른
Msgbox 숫자로 나이를 입력해주세요.
다음과 같은 경우 종료
서브 끝
//-->
</스크립트>
<FORMmethod=POST 이름=MyFormaction=myfile.asp> 이름: <INPUT 유형=텍스트 이름=이름>
연령: <입력 유형=텍스트 이름=나이>
<입력종류=버튼명=btnEntervalue=Enter>
</양식>
지역변수를 사용하고 전역변수는 피하세요. 전체 이름 도메인을 검색할 필요가 없기 때문에 지역 변수는 전역 변수보다 Asp 스크립트 엔진에서 더 빠르게 액세스됩니다. 배열 정의를 변경하지 마십시오. 처음 초기화할 때 단순히 충분한 크기를 할당하는 것이 더 효율적입니다. 이 경우 메모리가 일부 낭비될 수 있지만 속도 측면에서 이점을 얻을 수 있습니다. 이 기술은 서버의 부하가 높을 때 확실히 효과적입니다.
꼭 사용하지 않는 개체를 참조해야 하는 경우 Server.CreateObject 메서드를 사용하는 대신 <OBJECT> 태그를 사용하는 것이 좋습니다. Server.CreateObject를 사용하면 객체가 즉시 생성됩니다. 반면, <OBJECT> 태그는 객체를 <object>로 정의한 후 사용하지 않으면 리소스를 낭비하지 않습니다.
예: 다음 예에서는 <OBJECT> 태그를 사용하여 응용 프로그램 범위 광고 휠 Ad Rotator 개체 구현을 만듭니다.
예:
<OBJECT runat=서버 범위=애플리케이션 ID=MyAds progid=MSWC.AdRotator>
</OBJECT>
응용 프로그램에 Ad Rotator 개체를 저장한 후 다음 구문을 사용하여 모든 프로그램 페이지에서 개체에 액세스할 수 있습니다.
<%=MyAds.GetAdvertisement(CustomerAds.txt) %>
'옵션 명시적' 스위치를 켭니다. VB 및 VBScript에서는 명시적인 선언 없이 변수를 사용할 수 있습니다. 하지만 이 옵션을 켜면 변수를 식별하고 정의할 수 있어 변수를 잘 작성할 수 있고 성능 향상에 도움이 됩니다. 정의되지 않은 지역 변수는 변수를 만들기 전에 네임스페이스를 검색하여 변수가 존재하는지 확인해야 하기 때문에 속도가 더 느립니다. 이를 제거하고 모든 변수를 명확하게 정의하십시오(먼저 정의하고 나중에 사용).
이것은 좋은 습관입니다. 오타를 잡을 수도 있고 속도도 더 빨라집니다.
꼭 사용해야 하는 경우가 아니면 Server.MapPath 메서드를 사용하지 마세요. 알고 있다면 실제 경로를 사용하십시오. MapPath를 사용하려면 IIS가 현재 서버 경로를 검색해야 하며, 이는 특별한 요청을 서버에 보내야 함을 의미하며 이는 성능이 저하됨을 의미합니다. 또 다른 방법은 경로를 로컬 변수에 저장하고 필요할 때 사용하여 서버가 여러 번 조회할 필요가 없도록 하는 것입니다.
잘 지내고 있는지 확인해보세요
시스템 성능 모니터, netMon 및 PerfMon과 같은 도구를 통해 시스템 성능을 측정할 수 있습니다. 웹* 성능을 테스트하려면 WCAT(웹 용량 분석 도구)를 사용할 수 있습니다. WCAT를 사용하면 다양한 클라이언트 요청, 데이터 또는 HTML 페이지에 응답하는 IIS 서버 및 네트워크 구성의 기능을 테스트할 수 있습니다. 이러한 테스트 결과는 서버 및 네트워크 구성을 최적화하기 위한 지침으로 사용될 수 있습니다. WCAT는 Windows 2000(또는 Windows NT) 및 IIS의 인터넷 서비스가 응답할 수 있는 고객 작업량을 추정하도록 특별히 설계되었습니다.
(시뮬레이션). 자세한 내용은 IIS 리소스 키트를 참조하세요. MSDN 온라인 웹 상점 사이트에는 다운로드 링크가 포함된 긴 WCAT 사용자 가이드도 있습니다. Asp* 기능을 중요하게 생각한다면 이 도구를 꼭 구입하십시오.
애플리케이션 성능을 최적화하기 위해 노력하면 웹 애플리케이션이 더욱 원활하게 실행됩니다. 실제로 필요하지 않은 경우 서버 성능에 영향을 주지 마십시오.
ASP는 저장 프로시저를 사용하여 데이터 페이징을 구현합니다.
1. tiku_koushi 테이블 생성
존재하는 경우(dbo.sysobjects에서 * 선택, 여기서 id =
object_id(N'[dbo].[tiku_koushi]') 및 OBJECTPROPERTY
(id, N'IsUserTable') = 1)
드롭 테이블 [dbo].[tiku_koushi]
가다
테이블 만들기 [dbo].[tiku_koushi] (
[id] [int] IDENTITY (1, 1) NOT NULL,
[제목] [varchar] (250) 대조
중국어_PRC_CI_AS NULL ,
[list2_id] [문자] (10) 대조
중국어_PRC_CI_AS NULL
) [기본] 사용
가다
2. 저장 프로시저 sp_c
프로세스 sp_c 생성
@테이블이름 varchar(50),
@제목 varchar(250),
@list2_id varchar(50)
~처럼
@tablename='tiku_koushi'인 경우
제목이 '%'+@title+'%' 및 list2_id=@list2_id인 tiku_koushi에서 개수(*)를 선택하세요.
가다
3. 저장 프로시저 sp_search_tiku
절차 생성 sp_search_tiku
@테이블이름 varchar(50),
@제목 varchar(250),
@list2_id varchar(10),
@pagesize 정수,
@페이지 정수
처럼
@tablename='tiku_koushi'인 경우
시작하다
@ks int 선언
@str varchar(200) 선언
@ks=@pagesize*(@page-1) 설정
존재하지 않는 경우(dbo.sysobjects에서 * 선택, 여기서 id = object_id(N'[dbo].[temp_table91]') 및 OBJECTPROPERTY(id, N'IsUserTable') = 1)
시작하다
tiku_koushi에서 temp_table91로 *를 선택하세요.
'%'+@title+'%' 및 list2_id=@list2_id 순서와 같은 제목
ID 설명으로
행 개수 @pagesize 설정
set @str='select * from temp_table91 여기서 ID가 없음
(temp_table91에서 최상위 '+str(@ks)+' ID 선택)'
실행(@str)
드롭 테이블 temp_table91
끝
끝
가다
4. search_koushi.asp
<!-- #include 파일=conn.asp -->
<%
라인=6
요청(페이지)=이면
페이지=1
또 다른
페이지=요청(페이지)
종료하면
페이지<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
종료하면
CInt(페이지)>=페이지 개수인 경우
page=CInt(페이지 수)
종료하면
str=
str=str&page=&page&&title=&title&&list2_id=&list2_id
rs=conn.execute를 설정합니다.
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(페이지)&')
만약 rs.eof라면
응답.기록 없음
또 다른
%>
<html>
<머리>
<스타일 유형=텍스트/css>
td{글꼴 크기:12px;}
a{텍스트 장식:없음;}
</style>
<스크립트 언어=자바스크립트>
</script>
</head>
<본문>
<테이블 너비=518 border=1 bordercolorlight=000000
bordercolordark=#ffffff
정렬=가운데 셀패딩=0 셀 간격=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 높이=22>
<td valign=중간>·<a href=void(0)
onclick=window.open('editkoushi.asp?id=<%=rs(id)%>&page=<%=page%>&title=<%=title%>&list2_id=<%=list2_id%>','' ,'너비=518
높이=160 왼쪽=100')>
<%=rs(제목)%></a></td>
<td align=center valign=middle>삭제</td>
</tr>
<%
rs.movenext
고리
%>
<tr 정렬=왼쪽 valign=가운데 bgcolor=effeff6
높이=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>
</table>
</body>
</html>
<%
RS2.닫기
rs2=아무것도 설정하지 않음
RS.닫기
rs=아무것도 설정하지 않음
종료하면
%>