Я создал приложение, которое отображает mvc-представления в строки и использует HiQPDF для рендеринга PDF-отчета. Это хорошо работает, однако, повторные звонки в IView.Render вызывает значительное ухудшение производительности. Каждый вызов занимает около 1 с дольше, чем предыдущий вызов, - и отображаемый html почти то же самое.Rendering View to string performance
Кто-нибудь знает о других способах рендеринга html, которые не принимают такого рода производительность? Кто-нибудь знает, почему я вижу такую плохую производительность с помощью этого кода?
protected string RenderViewToStringInternal(string viewPath, object model,
bool partial = false,
string master = null)
{
//Find cached view
ViewEngineResult viewEngineResult = _cachedViews.ContainsKey(viewPath) ? _cachedViews[viewPath] : null;
if (viewEngineResult == null)
{
//Get view engine result
if (partial)
viewEngineResult = ViewEngines.Engines.FindPartialView(Context, viewPath);
else
viewEngineResult = ViewEngines.Engines.FindView(Context, viewPath, master);
if (viewEngineResult != null)
{
_cachedViews.Add(viewPath, viewEngineResult);
}
}
if (viewEngineResult == null)
throw new FileNotFoundException("View not found");
// get the view and attach the model to view data
var view = viewEngineResult.View;
Context.Controller.ViewData.Model = model;
string result = null;
using (var sw = new StringWriter())
{
var ctx = new ViewContext(Context, view,
Context.Controller.ViewData,
Context.Controller.TempData,
sw);
DateTime start = DateTime.Now;
**view.Render(ctx, sw);** //This line's performance degrades after subsequent calls with similar data
DateTime end = DateTime.Now;
Logging.LogInformation(Logging.TraceType.UI, string.Format("ViewRenderer.RenderViewToStringInternal view.Render execution time: {0}", end.Subtract(start).TotalSeconds));
viewEngineResult.ViewEngine.ReleaseView(Context, view);
result = sw.ToString();
}
return result;
}
может быть своего рода блокировкой, является ли представление, выполняющее все, что ему нужно, и выполнять вычисления или доступ к файлам? Попробуйте визуализировать представление с контроллера и многократно возвратить html и посмотреть, есть ли у него также медленный –
, который я тестировал через контроллер (через рендеринг всех страниц отчета через частичные). Выполнение этого снова и снова (обновление страницы в браузере) показывает очень хорошую производительность. Каждая загрузка страницы остается постоянной .5 секунд. Если после 10 или 20 рендерингов с использованием приведенного выше кода может потребоваться более 60 секунд для небольшой части отчета ... – voidsstr
Я должен добавить - это не происходит на моем ноутбуке разработки с теми же данными образца. Это происходит только на наших серверах разработки и промежуточного уровня (Im, предполагая, что это произойдет и в производстве). – voidsstr