2015-06-03 39 views
0

我正在研究生成pdf的方法。爲此我使用tuespechkin庫。轉換本身非常快。大部分時間需要從數據庫檢索數據並創建pdf的html表示。 爲了提高性能,我嘗試使用異步方法和PLinq,但沒有多大幫助。 有沒有一種方法來優化這種方法?如何在MVC操作方法中改進Linq-to-sql

代碼(更新)的最昂貴的部分:

StringBuilder html = new StringBuilder(1024 * 1024); // adapt memory reservation depending on document size 
//---------------------------- Start page -----------------------------------------------------------// 
imageArray = System.IO.File.ReadAllBytes(HttpContext.Server.MapPath("../Content/images/pdf_logo.jpg")); 
base64ImageRepresentation = Convert.ToBase64String(imageArray); 
html.Append("<div class='break' style='margin: 0 0 0 0px;'>"); 
    html.Append("<img class='report-img' style='margin:150px 0 400px 0;' src='data:image/jpeg;base64," + base64ImageRepresentation + "'></img>"); 
    html.Append("<p class='purpleText' style='color:#8E0033; font-size: 30px; margin:0; line-height:20px;'>" + title + "</p>" + 
      "<p class='purpleText' style='color:#8E0033; font-size: 16px;'>" + bigTitle + "</p>"); 
    html.Append("<p style='color:#980000; font-size: 50px; margin: 46px 0 0 0;'>" + custName.firstName + " <span>" + custName.lastName + "</span></p>"); 
html.Append("</div>"); 

//------------------------------------ 2nd page -----------------------------------------------------------// 
html.Append("<div class='text-block break'></div>"); 

//=======================================================================================================================// 
//------------------------------------- Generate menu (p4) ----------------------------------------------------------// 
html.Append(header); 
html.Append("<span class='menu-title'>INNHOLDSFORTEGNELSE</span>"); 
html.Append("<ul class='content-list break'>"); 

//------------------ Innlednings menu --------------------------// 
if (await db.Innlednings.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-header'>Innledning</li>"); 
} 
//------------------ Fordelings menu --------------------------// 
if (await db.Fordelings.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-header'>Fordeling av bruk og regninger</li>"); 
} 
//--------------------------------- Report Area Bruk Menu ----------------------------------------------------// 
//--------------------------- Get transaction category id of selected area ---------------------------// 
const string tranCatBruk = "Bruk"; 
var tranCatIdBruk = 0; 
if (await db.TransactionCategories.AnyAsync(n => n.Name == tranCatBruk)) 
{ 
    tranCatIdBruk = (await (db.TransactionCategories.FirstAsync(n => n.Name == tranCatBruk))).Id; 
} 
else 
{ 
    throw new HttpException(404, "'" + tranCatBruk + "' transaction category does not exist!"); 
} 
if (await db.ReportViews.AnyAsync(n => n.CustomerId == customerId && n.TransactionCategoryId == tranCatIdBruk)) 
{ 
    html.Append("<li class='list-header'>Brukskonto</li>"); 

    if (await db.FordelingBruks.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Fordeling av brukskonto</li>"); 
    } 

    var rvBrukItems = await 
     db.ReportViews.Where(n => n.CustomerId == customerId && n.TransactionCategoryId == tranCatIdBruk).ToListAsync(); 
    foreach (var rvItem in rvBrukItems) 
    { 
     var mainCatName = (await db.Categories.FirstAsync(n => n.Id == rvItem.MainCategoryId)).Name; 

     if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.DifferentStoresImage.IsNullOrWhiteSpace() || 
      !rvItem.SubCategoryImage.IsNullOrWhiteSpace() || 
      !rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level2'>" + mainCatName + "</li>"); 
     } 
     //----------------- get images --------------------------// 
     if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Totalt pr. måned</li>"); 
     } 
     if (!rvItem.DifferentStoresImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Fordeling</li>"); 
     } 
     if (!rvItem.SubCategoryImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Kategorier</li>"); 
     } 
     if (!rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Transaksjoner pr. måned</li>"); 

     } 
     if (!rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Gjennomsnittlig handlebeløp</li>"); 

     } 

    } 

} 
//--------------------------------- Report Area Regning Menu ----------------------------------------------------// 
//--------------------------- Get transaction category id of selected area ---------------------------// 
const string tranCatRegning = "Regning"; 
var tranCatIdRegning = 0; 
if (await db.TransactionCategories.AnyAsync(n => n.Name == tranCatRegning)) 
{ 
    tranCatIdRegning = (await db.TransactionCategories.FirstAsync(n => n.Name == tranCatRegning)).Id; 

} 
else 
{ 
    throw new HttpException(404, "'" + tranCatRegning + "' transaction category does not exist!"); 
} 
if (await db.ReportViews.AnyAsync(n => n.CustomerId == customerId && n.TransactionCategoryId == tranCatIdRegning)) 
{ 
    html.Append("<li class='list-header'>Regningskonto</li>"); 

    if (await db.FordelingBruks.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Fordeling av regningskonto</li>"); 
    } 

    var rvBrukItems = await 
     db.ReportViews.Where(n => n.CustomerId == customerId && n.TransactionCategoryId == tranCatIdRegning).ToListAsync(); 

    foreach (var rvItem in rvBrukItems) 
    { 
     var mainCatName = (await db.Categories.FirstAsync(n => n.Id == rvItem.MainCategoryId)).Name; 
     if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.DifferentStoresImage.IsNullOrWhiteSpace() || 
      !rvItem.SubCategoryImage.IsNullOrWhiteSpace() || 
      !rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level2'>" + mainCatName + "</li>"); 
     } 
     //----------------- get images --------------------------// 
     if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Totalt pr. måned</li>"); 
     } 
     if (!rvItem.DifferentStoresImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Fordeling</li>"); 
     } 
     if (!rvItem.SubCategoryImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Kategorier</li>"); 
     } 
     if (!rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Transaksjoner pr. måned</li>"); 

     } 
     if (!rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level3'>Gjennomsnittlig handlebeløp</li>"); 

     } 

    } 

} 
//------------------ Inntekt menu --------------------------// 
html.Append("<li class='list-header'>Inntekt</li>"); 
if (await db.InntektPerMonths.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-level2'>Inntekt per måned</li>"); 
} 
if (await db.InntektSubCategories.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-level2'>Fordeling av inntekt</li>"); 
} 
if (await db.InntektFordelings.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-level2'>Fordeling mellom inntekt og forbruk</li>"); 
} 

//----------------- SPARING menu ------------------------// 
if (db.SparingKommentarers.Any(n => n.CustomerId == customerId) || 
    db.SparingTabells.Any(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-header'>Sparing</li>"); 

    if (await db.SparingKommentarers.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Kommentar</li>"); 
    } 
    if (await db.SparingRads.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Sparetips</li>"); 
    } 
    if (await db.SparingTabells.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Tabell</li>"); 
    } 
} 
//----------------- BUDSJETT menu ------------------------// 
if (db.Budsjettkommentarers.Any() || 
    db.BudsjettGraf1s.Any() || 
    db.TotalBruks.Any() || 
    db.TotalRegningers.Any()) 
{ 
    html.Append("<li class='list-header'>Budsjett</li>"); 

    if (await db.Budsjettkommentarers.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Kommentar</li>"); 
    } 
    if (await db.TotalBruks.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Totalt bruk</li>"); 
    } 
    if (await db.TotalRegningers.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Total regninger</li>"); 
    } 
    if (await db.BudsjettGraf1s.AnyAsync(n => n.CustomerId == customerId)) 
    { 
     html.Append("<li class='list-level2'>Budsjett tall</li>"); 
    } 
} 
//----------------- OPPSUMMERING(Articles) menu ------------------------// 
if (await db.Articles.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    html.Append("<li class='list-header'>Oppsummering</li>"); 
} 

//------------------ End of Menu -----------------------------------------------// 
html.Append("</ul>"); 

//------------------ two blank pages (6-7) ---------------------------------------// 


////------------------------------- Start generating inner pdf ---------------------------------------------// 
////---------------------------------------Innledning------------------------------------------------------// 
var customerforInnlending = await db.Innlednings.FirstOrDefaultAsync(inl => inl.CustomerId == customerId); 
html.Append(header); 

string textforInnlending = (customerforInnlending != null) ? customerforInnlending.Text : "<b>Empty Text</b>"; 

html.Append("<h1 class='menu-title'>Innledning </h1>" + 
     "<div class='text-block'>" + textforInnlending + "</div>" + 
     "<p class='break'></p>"); 
html.Append("<br>"); 


//-----------------------------------Fordeling-----------------------------------------------------------// 
var fordelingList = await db.Fordelings.Where(cus => cus.CustomerId == customerId).ToListAsync(); 
foreach (var item in fordelingList) 
{ 
    if (!item.TransactionsImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling av bruk og regninger </h1>"); 
     html.Append("<img class='report-img circlediagram' width='800px' height='auto' src='" + item.TransactionsImage + "'></img>"); 
     html.Append("<div class='text-block'>" + item.Text + "</div>"); 
    } 
    if (!item.TopTransactionsImage.IsNullOrWhiteSpace()) 
    { 
     html.Append("<img class='report-img stolpeddiagram mtop30' width='600px' height='auto' src='" + item.TopTransactionsImage + "'></img>"); 
    } 
    html.Append("<div class='text-block break'></div>"); 

} 

//---------------------------- Bruskonto title -----------------------------------------------------------// 
imageArray = System.IO.File.ReadAllBytes(HttpContext.Server.MapPath("../Content/images/bruk_header.png")); 
base64ImageRepresentation = Convert.ToBase64String(imageArray); 
html.Append(header); 
html.Append("<div class='break' style='display:block;padding-top:300px;padding-left:0px;'>"); 
html.Append("<img class='report-img' src='data:image/png;base64," + base64ImageRepresentation + "'></img>"); 
html.Append("</div>"); 



////------------------------------------------------Fordeling av Bruk------------------------------------------------------// 
var fordelingBruk = await db.FordelingBruks.Where(cus => cus.CustomerId == customerId).ToListAsync(); 
foreach (var item in fordelingBruk) 
{ 
    if (!item.MainCatImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1>Fordeling av Brukskonto </h1>"); 
     html.Append("<img class='report-img circlediagram' src='" + item.MainCatImage + "'></img>"); 
     html.Append("<div class='text-block'>" + item.Text + "</div>"); 
    } 
    if (!item.TopMainCatImage.IsNullOrWhiteSpace()) 
    { 
     html.Append("<img class='report-img stolpeddiagram mtop30' width='600px' height='auto' src='" + item.TopMainCatImage + "'></img>"); 
    } 
    html.Append("<div class='text-block break'></div>"); 
} 




//------------------------------------------------ ReportView Bruk------------------------------------------------------// 
//--------------------------- Get transaction category id of selected area ---------------------------// 
var tranCat = "Bruk"; 
var tranCatId = 0; 
if (await db.TransactionCategories.AnyAsync(n => n.Name == tranCat)) 
{ 
    tranCatId = (await db.TransactionCategories.FirstAsync(n => n.Name == tranCat)).Id; 

} 
else 
{ 
    throw new HttpException(404, "'" + tranCat + "' transaction category does not exist!"); 

} 

var reportViewBrukList = db.ReportViews.AsParallel().Where(n => n.TransactionCategoryId == tranCatId && n.CustomerId == customerId).ToList(); 

foreach (var rvItem in reportViewBrukList) 
{ 
    var mainCatName = (await db.Categories.FirstAsync(n => n.Parent == null && n.Id == rvItem.MainCategoryId)).Name; 
    //----------------- get images --------------------------// 
    if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Diverse " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.TotalPerMonthImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.TotalPerMonthText + "</div>"); 
    } 
    if (!rvItem.DifferentStoresImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling av " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.DifferentStoresImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.DifferentStoresText + "</div>"); 


    } 
    if (!rvItem.SubCategoryImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling på " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.SubCategoryImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.SubCategoryText + "</div>"); 
    } 
    if (!rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1>" + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.TransactionsPerMonthImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.TransactionsPerMonthText + "</div>"); 

    } 
    if (!rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Antall transaksjoner pr. mnd på " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.AverageTradeValueImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.AverageTradeValueText + "</div>"); 

    } 

} 

//---------------------------- Regningskonto title -----------------------------------------------------------// 
imageArray = System.IO.File.ReadAllBytes(HttpContext.Server.MapPath("../Content/images/regninger_header.png")); 
base64ImageRepresentation = Convert.ToBase64String(imageArray); 
html.Append(header); 
html.Append("<div class='break' style='display:block;padding-top:300px;padding-left:0px;'>"); 
html.Append("<img class='report-img' src='data:image/png;base64," + base64ImageRepresentation + "'></img>"); 
html.Append("</div>"); 

//-------------------------------------------- Fordeling av regninger (page 39) ---------------------------------------------------------// 
var fordelingRegninger = await db.FordelingRegningers.Where(cus => cus.CustomerId == customerId).ToListAsync(); 
foreach (var item in fordelingRegninger) 
{ 
    if (!item.MainCatImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1>Fordeling av regninger </p>"); 
     html.Append("<img class='report-img circlediagram' width='800px' height='auto' src='" + item.MainCatImage + "'></img>"); 
     html.Append("<div class='text-block'>" + item.Text + "</div>"); 
    } 
    if (!item.TopMainCatImage.IsNullOrWhiteSpace()) 
    { 
     html.Append("<img class='report-img stolpeddiagram mtop30' width='600px' height='auto' src='" + item.TopMainCatImage + "'></img>"); 
    } 
    html.Append("<div class='text-block break'></div>"); 
} 


//------------------------------------------------ ReportView Regninger (p38-48)------------------------------------------------------// 
//--------------------------- Get transaction category id of selected area ---------------------------// 
tranCat = "Regning"; 
tranCatId = 0; 
if (await db.TransactionCategories.AnyAsync(n => n.Name == tranCat)) 
{ 
    tranCatId = (await db.TransactionCategories.FirstAsync(n => n.Name == tranCat)).Id; 

} 
else 
{ 
    throw new HttpException(404, "'" + tranCat + "' transaction category does not exist!"); 
} 

var reportViewRegningerList = db.ReportViews.AsParallel().Where(n => n.TransactionCategoryId == tranCatId && n.CustomerId == customerId).ToList(); 

foreach (var rvItem in reportViewRegningerList) 
{ 
    var mainCatName = (await db.Categories.FirstAsync(n => n.Parent == null && n.Id == rvItem.MainCategoryId)).Name; 
    //----------------- get images --------------------------// 
    if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Diverse " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.TotalPerMonthImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.TotalPerMonthText + "</div>"); 
    } 
    if (!rvItem.DifferentStoresImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling av " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.DifferentStoresImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.DifferentStoresText + "</div>"); 


    } 
    if (!rvItem.SubCategoryImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling på " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.SubCategoryImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.SubCategoryText + "</div>"); 
    } 
    if (!rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1>" + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.TransactionsPerMonthImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.TransactionsPerMonthText + "</div>"); 

    } 
    if (!rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Antall transaksjoner pr. mnd på " + mainCatName + "</h1>"); 
     html.Append("<img class='report-img img-size' src='" + rvItem.AverageTradeValueImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + rvItem.AverageTradeValueText + "</div>"); 

    } 

} 


//---------------------------- Inntekter title -----------------------------------------------------------// 
imageArray = System.IO.File.ReadAllBytes(HttpContext.Server.MapPath("../Content/images/inntekter_header.png")); 
base64ImageRepresentation = Convert.ToBase64String(imageArray); 
html.Append(header); 
html.Append("<div class='break' style='display:block;padding-top:300px;padding-left:0px;'>"); 
html.Append("<img class='report-img' src='data:image/png;base64," + base64ImageRepresentation + "'></img>"); 
html.Append("</div>"); 

//---------------------------------------- Inntekt per måned (p50) --------------------------------------------------------------// 
if (await db.InntektPerMonths.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    var innPerManed = await db.InntektPerMonths.FirstAsync(n => n.CustomerId == customerId); 
    if (!innPerManed.InntektPerMonthImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Inntekt per måned </h1>"); 
     html.Append("<img class='report-img img-size' src='" + innPerManed.InntektPerMonthImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + innPerManed.Text + "</div>"); 

    } 

} 

//---------------------------------------- Fordeling av inntekt (p51) --------------------------------------------------------------// 
if (await db.InntektFordelings.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    var innFordelings = await db.InntektSubCategories.FirstAsync(n => n.CustomerId == customerId); 
    if (!innFordelings.InntektSubCategoryImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling av inntekt </h1>"); 
     html.Append("<img class='report-img img-size' src='" + innFordelings.InntektSubCategoryImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + innFordelings.Text + "</div>"); 

    } 
} 


//---------------------------------------- Fordeling mellom inntekt og forbruk (p52) --------------------------------------------------------------// 
if (await db.InntektSubCategories.AnyAsync(n => n.CustomerId == customerId)) 
{ 
    var innSub = await db.InntektFordelings.FirstAsync(n => n.CustomerId == customerId); 
    if (!innSub.InntektFordelingImage.IsNullOrWhiteSpace()) 
    { 
     html.Append(header); 
     html.Append("<h1> Fordeling mellom inntekt og forbruk </h1>"); 
     html.Append("<img class='report-img img-size' src='" + innSub.InntektFordelingImage + "'></img>"); 
     html.Append("<div class='text-block break'>" + innSub.Text + "</div>"); 

    } 
} 

html.Append("</body></html>"); 

//---------- some code 
//........ 

var htmlStr = html.toString(); 

回答

0

字符串是在.NET不可變的。 您應該使用StringBuilder而不是字符串。

類似的東西:

StringBuilder sb = new StringBuilder(16 * 1024); // adapt memory reservation depending on document size 
sb.Append("string_to_append"); 
... 
return sb.ToString(); 

這種技術比+=有效得多

+0

使用StringBuilder而不是運營商有多大的區別? 檢查[this](http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/)。 –

+0

http://stackoverflow.com/questions/73883/string-vs-stringbuilder – labilbe

+0

謝謝,完全忘了StringBuilder。可悲的是這對性能沒有影響。就一點點。沒有明顯的變化。 還有其他一些優化技巧嗎? – nehfi

0

你可以做以下的事情來提高性能:

  1. 儘量少用追加的()上StringBuilder實例並以鏈式方式調用它。這可能會導致更多的調用append方法。但那取決於。你需要檢查和決定什麼是最適合你的。
  2. var替換爲除anonymous類型以外的確切類型。
  3. 請勿使用async/await(刪除並觀察它是否會影響性能),因爲我認爲這對您的情況不會有好處。 (這是可選的)
  4. 把變量置於foreach循環之外。

例子:

html.Append("<div class='break' style='margin: 0 0 0 0px;'><img class='report-img' style='margin:150px 0 400px 0;' src='data:image/jpeg;base64,") 
       .Append(base64ImageRepresentation) 
       .Append("</img><p class='purpleText' style='color:#8E0033; font-size: 30px; margin:0; line-height:20px;'>") 
       .Append(title) 
       .Append("</p><p class='purpleText' style='color:#8E0033; font-size: 16px;'>") 
       .Append(bigTitle) 
       .Append("</p><p style='color:#980000; font-size: 50px; margin: 46px 0 0 0;'>") 
       .Append(custName.firstName) 
       .Append("<span>") 
       .Append(custName.lastName) 
       .Append("</span></p></div>"); 

var例子:foreach循環內 var tranCatIdBruk = 0;int tranCatIdBruk = 0;

你使用了var關鍵字,這將導致降低性能(相信我,我已經做了實用上那個時候我很震驚:D)

外部變量的例子foreach

var mainCatName; // Replace var with string. 
foreach (var rvItem in rvBrukItems) 
    { 
     mainCatName = (await db.Categories.FirstAsync(n => n.Id == rvItem.MainCategoryId)).Name; 

     if (!rvItem.TotalPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.DifferentStoresImage.IsNullOrWhiteSpace() || 
      !rvItem.SubCategoryImage.IsNullOrWhiteSpace() || 
      !rvItem.TransactionsPerMonthImage.IsNullOrWhiteSpace() || 
      !rvItem.AverageTradeValueImage.IsNullOrWhiteSpace()) 
     { 
      html.Append("<li class='list-level2'>" + mainCatName + "</li>"); 
     } 
} 

對於StringBuilder Append()你可以參考下面的鏈接,解釋了什麼是內部發生:

String Builder best practices

希望這會幫助你。如果您有任何疑問,請告訴我。