2011-12-31 1 views
1

У нас есть следующий классический код asp, который читается из XML-файла, он показывает низкую производительность при наличии более 10 одновременных запросов на эту страницу, может кто-то выяснить проблему производительности в этом коде (мы знаем, одна из проблем, которая с помощью FileSystemObject, но у нас нет альтернативы для него!):Как оптимизировать этот код, который читается из xml-файла

set filesys=server.CreateObject("Scripting.FileSystemObject") 
if filesys.FileExists(sourcefile) then 
set source = Server.CreateObject("Msxml2.DOMDocument") 
source.validateOnParse = false 
source.resolveExternals = false 
source.preserveWhiteSpace = false 
source.load(sourcefile) 

If source.ParseError.errorCode <> 0 Then 
    str_head=source.selectSingleNode("/LIST/ITEM/NEWSITEM/HEADLINE//").text 

    str_by=source.selectSingleNode("//LIST//ITEM//NEWSITEM//PROVIDER//").text 

    News_date_orig = source.selectSingleNode("/LIST/ITEM/NEWSITEM/CREATED//").text 
    str_date= formatdatetime(source.selectSingleNode("//LIST//ITEM//NEWSITEM//CREATED//").text,1) 
    set bodyNode=source.selectSingleNode("/LIST/ITEM/NEWSITEM//BODY//") 
    styleFile=Server.MapPath("/includes/xsl/template.xsl") 
    Set style = Server.CreateObject("Msxml2.DOMDocument") 
    style.validateOnParse = false 
    style.resolveExternals = false 
    style.preserveWhiteSpace = false 
    style.load(styleFile) 
    news_full = bodyNode.transformNode(style) 
    if len(news_full) < 10 then 
    news_full = str_abstract 
end if 
DiscriptionKeyWord = stripHTMLtags(news_full) 
DiscriptionKeyWord=StrCutOff(DiscriptionKeyWord, 200, "...") 
headerTitle=str_head 
Set style=nothing 
Set source = nothing 
end if 
set filesys= nothing 

Ниже функция stripHTMLtags:

Function stripHTMLtags(HTMLstring) 
    Set RegularExpressionObject = New RegExp 
    With RegularExpressionObject 
    .Pattern = "<[^>]+>" 
    .IgnoreCase = True 
    .Global = True 
    End With 
    stripHTMLtags = RegularExpressionObject.Replace(HTMLstring, "") 
    Set RegularExpressionObject = nothing 
End Function 

UPDATE: Я поставил таймер, чтобы показать время выполнения для функции, которая читает xml-файл, и обнаружил, что он занимает около 3 секунд на рабочем сервере, а на моем ПК занимает менее 1 секунды! Что это значит ?! Я потерялся.

ответ

3

Option Explicit

Если ваши сценарии не начинаются с Option Explict затем внести изменения в настоящее время. Затем исправить все ошибки компиляции, которые появляются. Не помогает производительность, но когда я вижу доказательства того, что эта самая большая ошибка в сценариях делается, просто нужно упомянуть.

FileSystemObject

Я сомневаюсь, что проблема производительности является результатом FileSystemObject, все, что вы делаете, это создание экземпляра и тестирования для существования файла. Это вряд ли вызовет проблему.

Сказав, что я все равно откажу FileSystemObject. Просто позвольте сценарию выдавать ошибку, если есть проблема. Используйте диспетчер IIS для сопоставления 500.100 кодов состояния на страницу ASP, которая представляет пользователю дружественную страницу «Что-то плохое случилось». (500.100 - это статус запроса, когда скрипт генерирует исключение). Также проверяйте логический результат метода DOM load, выведите ошибку, когда ошибка анализа также не является 0. Таким образом, вы передадите всю уродливую обработку исключений на страницу обработки 500.100, и ваш код может оставаться чистым, просто имея дело с номинальным путем кода.

прибраться путем

Возможно, есть причина, почему вы используете «//» много в ваших путях (но непоследовательно), но я собираюсь предположить, что это не так, мы можем упростить некоторые из путей:

Dim newsItem: Set newsItem = source.selectSingleNode("/LIST/ITEM/NEWSITEM") 

Dim str_head: str_head = newsItem .selectSingleNode("HEADLINE").text 

Dim str_by: str_by = newsItem .selectSingleNode("PROVIDER").text 

Dim News_date_orig: News_date_orig = newsItem .selectSingleNode("CREATED").text 
Dim str_date: str_date = formatdatetime(News_date_orig, 1) 

Dim bodyNode: Set bodyNode = newsItem.selectSingleNode("BODY") 

Cache XSLTemplate

область, где вы могли бы получить некоторое улучшение реального в производительности является кэширование XSL преобразование в приме (что возможно из-за того, что XSLTemplate является свободным поточным объектом). Как это:

Dim xslTemplate 
If IsObject(Application("xsl_template")) Then 
    Set xslTemplate = Application("xsl_template") 
Else 
    Set style = Server.CreateObject("Msxml2.FreeThreadedDOMDocument.3.0") 
    style.async = false  
    style.validateOnParse = false  
    style.resolveExternals = false  
    style.preserveWhiteSpace = false  
    style.load Server.MapPath("/includes/xsl/template.xsl") 

    Set xslTemplate = CreateObject("MSXML2.XSLTemplate.3.0") 
    xslTemplate.stylesheet = xsl 
    Set Application("template") = xslTemplate 
End If 

Dim xslProc: Set xslProc = xslTemplate.createProcessor() 
xslProc.input = bodyNode 

xslProc.transform() 
news_full = xslProc.output 

Попытка читать, анализировать и компилировать XSL преобразование выполняется только один раз во всей жизни приложения.

Наиболее вероятным виновником

Честно говоря, я подозреваю, что наиболее вероятным виновником является stripHTMLtags. Это звучит как целая загрузка обработки строк, а производительность обработки строк VBScript оставляет желать лучшего. Его особенно плохо, когда код не правильно оптимизирован, чтобы знать ограничения производительности обработки строк (например, чрезмерные и повторяющиеся конкатенации строк). Вероятно, это также место, где встречается самый фактический VBScript, который часто является причиной проблемы с производительностью.

+0

Я не думаю, что stripHTMLtags причина, здесь его тело: Функция stripHTMLtags (HTMLString) \t Set RegularExpressionObject = New RegExp \t С RegularExpressionObject \t .Pattern = "<[^>] +>" \t .IgnoreCase = True \t. Global = True \t End With \t stripHTMLtags = RegularExpressionObject.Replace (HTMLString, "") \t Set RegularExpressionObject = ничего End Function – Cassini

+0

@Cassini: Комментарии не являются хорошим местом, чтобы поместить код. Измените свой вопрос и включите в него код для 'stripHTMLTags'. – AnthonyWJones

+0

Отредактировано ... как вы можете видеть, это использование выражения регулятора. – Cassini

0

Вы можете загрузить XML в строку при запуске приложения и сохранить его в объекте Application.

Затем, вместо использования source.load, используйте source.loadXML с этой строкой - вы больше не будете обращаться к файловой системе. См. Документацию для loadXML.

Для использования этого метода используйте версию MSXML 3.0 или более.

Server.CreateObject("Msxml2.DOMDocument.6.0") 

Update - видя, как у вас есть тысячи этих файлов, и вы уверены, что это неосуществимо, чтобы хранить их в памяти в Application объекта, вы должны использовать базу данных для обработки проблем параллелизма, которые вы видите , Храните содержимое файлов с ключом в виде своего текущего имени файла/пути - извлеките их из базы данных и загрузите в документ с использованием того же механизма loadXML.

+0

Невозможно, потому что у нас есть тысячи xml-файлов, которые читаются. Я уже пробовал msxml версии 6 для этого кода, но получил много проблем. – Cassini

+0

@Cassini. Если вы не можете кэшировать файлы, вам может потребоваться использовать базу данных для их хранения. – Oded

+0

@ Cassini - У вас установлена ​​версия 6? Вместо этого вы можете использовать 3.0, 4.0. – Oded

 Смежные вопросы

  • Нет связанных вопросов^_^