ASP может быстро выполнять ваши динамические веб-страницы, но вы также можете ускорить их выполнение за счет сжатия кода и подключений к базе данных. Это подробная статья о том, как оптимизировать код и функции ASP, чтобы добиться максимальной скорости выполнения. Для нетерпеливого пользователя любая задержка между нажатием пользовательской кнопки и появлением результата на экране может означать, что он просматривает другой сайт? Если у вас есть коммерческий сайт, это может означать потерю потенциальных продаж.
У нас нет никакого способа контролировать пропускную способность пользователя, но мы добились максимальной производительности, оптимизировав сайт ASP. Большинство потенциальных улучшений производительности достигается за счет изменений в системе, а не за счет ужесточения кода. Неуместная идея — просить системного администратора обновить систему, если вы столкнулись с проблемами эффективности системы.
Во-первых, какие факторы могут повлиять на производительность Asp? К сожалению, есть много факторов? Это лишь некоторые из них:
доступная полоса пропускания
Скорость процессора и другого оборудования на сервере
Другие программы, работающие на сервере (например, заставки OpenGL!)
Режим подключения к базе данных, пул подключений, сама система базы данных (например, Oracle лучше, чем Sql Server, сервер Sql лучше, чем Access)
используемый язык
Хранимые процедуры лучше, чем операторы SQL на основе строк.
Используйте скомпилированные компоненты вместо VB или JavaScript, хороший опыт программирования ASP, например, обработку ошибок и т. д.
Некоторые из вышеперечисленных факторов уже могут быть замечены разработчиками, обладающими знаниями и опытом работы с IIS, но другие могут оказаться для них очень сложными проблемами. В этой статье мы попытаемся объяснить все факторы, влияющие на производительность Asp*, и рассмотрим основные вещи, которые можно сделать за те несколько миллисекунд, которые мы бреем.
Размер сценария ASP
Ваша страница сценария (и другие страницы) длиннее, чем необходимо? Это снизит производительность Asp* сразу после его выполнения. Сценарии ASP полезны для получения информации и форматирования вывода, но сценарии также интерпретируются построчно, поэтому чем длиннее ваш сценарий, тем больше времени потребуется для его выполнения.
Если ваш сценарий огромен, что вы можете сделать, чтобы уменьшить его длину? Вот несколько предложений:
Можете ли вы преобразовать их в серверные компоненты, то есть в библиотеки VB DLL, или в некомпилированные компоненты с помощью расширенных языков программирования Windows или соответствующих языков COM-интерфейса? И зарегистрировать их на стороне сервера. Краткое руководство можно найти по адресу
Найдено по адресу http://www.webdevelopersjournal.com/articles/activex_for_asp.html. Компиляция хорошо написанного компонента ActiveX может не только значительно повысить производительность, но и защитить ваше программное обеспечение (скрипты), особенно когда вы публикуете свой сайт ASP на стороннем хосте.
Поскольку сценарии интерпретируются построчно, производительность можно повысить, исключив лишние сценарии или создав более эффективные сценарии. Если у вас есть сотни строк кода в одном файле ASP, вероятно, таким образом вы сможете хорошо разделить пользователей, транзакции и службы данных. На самом деле, если вы сделаете это, вы можете обнаружить некоторый избыточный код: если вам нужно вывести несколько таблиц, вы можете написать общую функцию для вывода таблицы и просто вызывать ее несколько раз.
Говоря о размере сценариев Asp, мы должны упомянуть размер включенных файлов. Когда вы используете включаемый файл, загружается весь включаемый файл. Когда включаемый файл включается, это эквивалентно написанию этой части кода в самом файле Asp. Поэтому, если вы определяете множество общих методов и определений в длинном включаемом файле, помните, что когда вы включаете файл, независимо от того, хотите ли вы использовать в нем каждый метод или определение, он будет включен во весь файл. ASP кэширует весь код расширения, что снижает эффективность поиска. В этом случае включаемый файл необходимо разбить на более мелкие модульные файлы. Также помните, что включаемые файлы обрабатываются сервером как отдельные запросы страниц, и использование слишком большого количества включаемых файлов может повлиять на время загрузки.
<!-- #include file=Header.asp -->
<!-- #include file=Footer.asp -->
<SCRIPT Language=vbscript runat=server>
Подглавная()
WriteHeader
WriteBody
Написать нижний колонтитул
Конец субтитра
SubWriteBody()
...
Конец субтитра
Main?'Вызов процедуры Main
</СКРИПТ>
Если ваш сценарий длинный, используйте Response.IsClientConnected. Это означает, что процессор вашего сервера может избежать ожидания в цикле, когда клиент больше не подключается к серверу.
<%
'Проверяем, подключен ли клиент
Если не Response.IsClientConnected Тогда
'Все еще на связи, обработчик
Еще
'отключиться
Конец, если
%>
Перемешивание ASP и HTML
Все ли это делают? Когда мы выводим таблицу, мы конвертируем код ASP в HTML, что является плохой привычкой. Например:
<HTML>
<ТЕЛО>
<%
Установите MyConn = Server.CreateObject(ADODB.Connection)
MdbFilePath = Server.MapPath(sample.mdb)
MyConn.Open Driver={Драйвер Microsoft Access (*.mdb)}; DBQ= & MdbFilePath & ;
SQL_query = ВЫБРАТЬ * ИЗ друзей
Установите RS = MyConn.Execute(SQL_query)
ПОКА НЕ RS.EOF
%>
<LI><%=RS(Имя)%>: <A HREF=>Домашняя страница</A>
<%
RS.MoveNext
ВЕНД
%>
</ТЕЛО>
</HTML>
Другой распространенный пример — использование оператора IF:
<%
Если не сеанс (DBOpen), то
%>
<H1>База данных не подключена</H1>
<%
Еще
%>
<H1>База данных открыта</H1>
<%
Конец, если
%>
В этих случаях производительность сценария можно повысить, написав серверный сценарий вместе и используя Response.write для генерации HTML-кода. например:
<%
Если не сеанс (DBOpen), то
Ответ. Напишите <H1>База данных не подключена</H1>.
Еще
Ответ. Напишите <H1>База данных открыта</H1>.
Конец, если
%>
В случае больших сценариев и большого количества сценариев вы увидите повышение производительности. Обратите внимание, что использование тегов <% по возможности избегается, чтобы повысить производительность. ASP не нужно вычислять код символов Ascii при выполнении сценария.
Статус сеанса
Нет сомнений в том, что возможность поддерживать определенное состояние посредством сеанса — очень мощная функция ASP. Однако это может повлиять на вашу* производительность. Очевидно, что масштабируемость вашего сайта станет еще одной проблемой, если вы ограничите использование сеансов. Однако сеансы потребляют ресурсы сервера для каждого пользователя.
Что, если вы не используете переменные сеанса или в этом нет необходимости? Является ли использование скрытых полей формы, сохранение данных в базе данных и строк запроса проблемой? Поэтому вам следует отключить состояние сеанса. Вы можете отключить использование сеанса с помощью следующего оператора:
@EnableSessionState = Ложь
Таким образом, ASP больше не будет проверять информацию о сеансе.
Если вам приходится полагаться на состояние сеанса, вам следует избегать хранения больших объемов данных в объекте сеанса. Сеанс в IIS будет поддерживаться до тех пор, пока доступен HTTP-файл cookie клиента, в результате чего память, занимаемая сеансом, будет занята до тех пор, пока сеанс не завершится или не истечет время ожидания. Таким образом, если вашу программу одновременно используют несколько пользователей, ресурсы вашего сервера могут быть исчерпаны.
Доступ к базе данных
Доступ к базе данных обязателен? Доступ к базе данных резко замедлит работу вашего приложения, но очевидно, что многие сайты будут бесполезны без базы данных. Но, обращаясь к базе данных через хранимые процедуры вместо использования встроенных операторов SQL, вы можете повысить потенциальную производительность. Они также обладают хорошей гибкостью* за счет использования хранимых процедур и объектов данных ActiveX (ADO). По возможности выводите данные из хранимых процедур.
Убедитесь, что в вашей базе данных есть индексы, поскольку это напрямую повысит эффективность вашей программы. Кроме того, попробуйте запустить статистику обновлений на сервере базы данных, чтобы отслеживать распределение данных, чтобы ваша база данных могла изменять выполнение запросов на основе этой информации. Обратите внимание, что некоторые базы данных, такие как MS Access, действительно приемлемы в программах корпоративного уровня? SQL Sever 7.0 или Oracle — лучший выбор.
Позвольте SQL работать так, как он был разработан для подсчета, объединения, сортировки и группировки данных. Если вы можете написать оператор запроса для выполнения этих действий, не делайте это самостоятельно на других языках.
Вот самый простой синтаксис для подсчета всех столбцов:
SELECT count(*) FROM издателей WHERE state='NY'
Если вы подсчитываете определенный столбец, вы должны использовать оператор group by для группировки этого столбца, иначе это не будет работать:
ВЫБЕРИТЕ количество (город), город ОТ издателей ГРУППА ПО городам
Возвращены категоризированные данные:
ВЫБРАТЬ * ИЗ имени таблицы ГДЕ Имя поля>50 ИЛИ Имя поля<100 ORDER BY Имя поля2, Имя поля3
Использовать Odbc или файловый DSN для подключения к базе данных? Используйте быструю технологию OLEDB Provider для подключения к базе данных вместо использования DSN-соединения. Больше не нужно просить вашего интернет-провайдера (или администратора базы данных/сетевого администратора) настроить для вас системный DSN, и при перемещении веб-файлов конфигурация не меняется.
OLEDB находится между уровнем ODBC и приложением. ADO — это приложение поверх ODEDB на ваших страницах ASP. Ваши вызовы ADO сначала отправляются в OLEDB, а затем на уровень ODBC. Однако вы можете подключиться напрямую к уровню OLEDB, и если вы это сделаете, вы увидите улучшение производительности на стороне сервера. Однако как подключиться напрямую к OLEDB?
Если вы используете SQLServer 7, используйте следующий код подключения для подключения к базе данных:
strConnString = DSN='';DRIVER={SQL SERVER} & _;
UID=myuid;PWD=mypwd; & _
БАЗА ДАННЫХ=MyDb;СЕРВЕР=МойСервер;
Наиболее важным параметром является часть DRIVER=. Если вы хотите обойти ODBC и подключиться к SQL Server с помощью OLEDB (это более быстрое соединение), используйте следующий синтаксис:
strConnString =Provider=SQLOLEDB.1;Пароль=мойпароль & _;
Persist Security Info=True;Идентификатор пользователя=myuid; & _;
Начальный каталог=имя_базы данных; & _
Источник данных=мойсервер;Время ожидания подключения=15
Что-то не так?
Теперь вам может быть интересно: в чем смысл этого нового метода подключения? Почему бы не использовать стандартный подход «без DSN/системный DSN»? Что ж, согласно результатам тестов Рокса в его книге «Справочник программиста ADO 2.0», если вы сравните соединение OLEDB с методом подключения DSN или без DSN, вы обнаружите следующие улучшения:
*Можно сравнить:
SQL-доступ
ОЛЕДБДСНОЛЕДБДСН
Время подключения: 18–82? Время подключения: 62–99
Время запроса 1000 записей: 29005400 Время запроса 1000 записей: 100950
Примечание. Этот результат можно найти на страницах 232 и 233 книги Wrox «Справочник программиста ADO 2.0». Время измеряется в миллисекундах, а время запроса 1000 записей рассчитывается с использованием курсора на стороне сервера (при использовании курсоров на стороне клиента нет большой разницы в производительности между наборами записей OLEDB и DSN).
Проблема с декодированием ASP:
По возможности проверяйте вводимые пользователем данные на стороне клиента, чтобы уменьшить количество двусторонних HTTP-запросов. Если ваш браузер поддерживает JavaScript или другие скрипты, используйте их возможности, чтобы освободить больше ресурсов сервера.
Следующий VBScript запускается в браузере клиента для проверки информации о пользователе перед ее отправкой на сервер:
<ЯЗЫК СКРИПТА=VBScript>
<!--
Подписка btnEnter_OnClick
DimTheForm
Установите TheForm = Document.MyForm
Если IsNumeric(TheForm.Age.Value) Тогда
Форма.submit
Еще
Msgbox Пожалуйста, введите числовой возраст.
Конец, если
Конец субтитра
//-->
</СКРИПТ>
<FORMmethod=имя POST=MyFormaction=myfile.asp> Имя: <INPUT typer=текстовое имя=Имя>
Возраст: <Тип ВХОДА=текстовое имя=Возраст>
<Тип ВХОДА=имя кнопки=btnEntervalue=Enter>
</ФОРМА>
Используйте локальные переменные и избегайте глобальных переменных. Доступ к локальным переменным обработчику сценариев Asp осуществляется быстрее, чем к глобальным переменным, поскольку не требуется выполнять поиск по всему домену имен. Избегайте изменения определений массива. Более эффективно просто выделить достаточный размер во время первой инициализации. В этом случае вы можете потратить немного памяти, но получите преимущество в скорости. Очевидно, что этот метод эффективен, когда сервер находится под большой нагрузкой.
Если вам нужно сослаться на объект, который не обязательно используется, лучше использовать тег <OBJECT> вместо метода Server.CreateObject. Использование Server.CreateObject приводит к немедленному созданию объекта. Напротив, тег <OBJECT> не создает объект немедленно. Если вы не используете объект после его определения с помощью <object>, вы не будете тратить ресурсы.
Например: В следующем примере тег <OBJECT> используется для создания реализации объекта Ad Rotator рекламного колеса на уровне приложения.
пример:
<ОБЪЕКТ runat=область сервера=Идентификатор приложения=MyAds progid=MSWC.AdRotator>
</ОБЪЕКТ>
После сохранения объекта Ad Rotator в приложении вы можете получить доступ к объекту на любой странице программы, используя следующий синтаксис.
<%=MyAds.GetAdvertisement(CustomerAds.txt) %>
Включите переключатель «Option Explicit». В VB и VBScript вы можете использовать переменные без явного объявления. Но включение этой опции позволяет идентифицировать и определять переменные, что позволяет улучшить запись переменных и повысить производительность. Неопределенные локальные переменные работают медленнее, поскольку перед созданием необходимо выполнить поиск в пространстве имен, чтобы узнать, существует ли переменная. Избавьтесь от этого и четко определите каждую переменную (сначала определите, используйте позже).
Это хорошая привычка, она помогает обнаружить опечатки и работает быстрее.
Если вам действительно не нужно его использовать, не используйте метод Server.MapPath. Используйте реальный путь, если вы его знаете. Использование MapPath требует, чтобы IIS получил текущий путь к серверу, а это означает, что на сервер необходимо отправить специальный запрос, что означает снижение производительности. Другой метод — сохранить путь в локальной переменной и использовать его при необходимости, чтобы серверу не приходилось выполнять поиск несколько раз.
Проверьте, как у вас дела
Вы можете измерить производительность своей системы с помощью таких инструментов, как System Performance Monitor, netMon и PerfMon. Чтобы протестировать производительность сети*, вы можете использовать WCAT (инструмент анализа веб-емкости). Используя WCAT, вы можете проверить способность вашего сервера IIS и конфигурации сети реагировать на широкий спектр клиентских запросов, данных или HTML-страниц. Результаты этих тестов можно использовать в качестве руководства по оптимизации конфигурации вашего сервера и сети. WCAT специально разработан для оценки объема рабочей нагрузки клиента, на которую могут реагировать интернет-службы в Windows 2000 (или Windows NT) и IIS.
(симуляция). Дополнительные сведения см. в пакете ресурсов IIS. На сайте MSDN Online Web sorkshop также имеется подробное руководство пользователя 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] ИДЕНТИЧНОСТЬ (1, 1) НЕ НУЛЬ,
[название] [varchar] (250) СОБРАТЬ
Chinese_PRC_CI_AS NULL ,
[list2_id] [char] (10) СОРТИРОВАТЬ
Chinese_PRC_CI_AS NULL
) НА [ОСНОВНОЙ]
ИДТИ
2. Хранимая процедура sp_c
СОЗДАТЬ процедуру sp_c
@имя_таблицы varchar(50),
@title варчар(250),
@list2_id varchar(50)
как
если @tablename='tiku_koushi'
выберите count(*) из tiku_koushi, где заголовок типа '%'+@title+'%' и list2_id=@list2_id
ИДТИ
3. Хранимая процедура sp_search_tiku
СОЗДАТЬ ПРОЦЕДУРУ sp_search_tiku
@имя_таблицы varchar(50),
@title варчар(250),
@list2_id varchar(10),
@pagesize целое число,
@page целое число
КАК
если @tablename='tiku_koushi'
начинать
объявить @ks int
объявить @str varchar(200)
set @ks=@pagesize*(@page-1)
если он не существует (выберите * из dbo.sysobjects, где id = object_id(N'[dbo].[temp_table91]') и OBJECTPROPERTY(id, N'IsUserTable') = 1)
начинать
выберите * в temp_table91 из tiku_koushi, где
заголовок типа '%'+@title+'%' и порядок list2_id=@list2_id
по идентификатору описания
установить количество строк @pagesize
установите @str='select * из temp_table91, где идентификатора нет
(выберите верхний идентификатор «+str(@ks)+» из temp_table91)'
выполнить(@str)
удалить таблицу temp_table91
конец
конец
ИДТИ
4. search_koushi.asp
<!-- #include file=conn.asp -->
<%
линия=6
если запрос(страница)= тогда
страница=1
еще
страница = запрос (страница)
конец, если
если страница<1, то
страница=1
конец, если
заголовок = обрезка (запрос (название))
list2_id = обрезка (запрос (list2_id))
set rs2=conn.execute(sp_c 'tiku_koushi','&title&','&list2_id&')
pagecount = CInt(rs2(0)/строка)
if(CInt(rs2(0)) mod line)=0 тогда
количество страниц = количество страниц
еще
количество страниц=количество страниц+1
конец, если
если CInt(страница)>=количество страниц, то
страница = CInt (количество страниц)
конец, если
ул=
str=str&page=&page&&title=&title&&list2_id=&list2_id
установить rs=conn.execute
(sp_search_tiku 'tiku_koushi','&title&','&list2_id&','&line&','&CInt(page)&')
если rs.eof тогда
ответ.не писать никаких записей
еще
%>
<html>
<голова>
<тип стиля=текст/css>
тд {размер шрифта: 12 пикселей;}
а {текст-декорация: нет;}
</стиль>
<язык сценария=javascript>
</скрипт>
</голова>
<тело>
<ширина таблицы=518 border=1 bordercolorlight=000000
bordercolordark=#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 высота=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>
</таблица>
</тело>
</html>
<%
rs2.закрыть
установить rs2=ничего
RS.закрыть
установить rs=ничего
конец, если
%>