我有一個處理零售促銷的C#程序集。它能夠在7秒內處理一次有1,288種合格產品的促銷活動。但是,如果它的任務是處理具有更多合格產品的促銷活動,那麼所花費的時間將與產品數量成指數增長。例如,29,962個產品的促銷需要7分鐘7秒,而77,350個產品的促銷需要39分鐘和7秒。理解VS性能分析
我一直在試圖確定程序集中是否有可以輕鬆優化的代碼。餘設置的組件處理中最大的促銷然後附着性能分析器到含處理(BizTalk主機實例)中,導致瞭如下報告:
這表明功能服用量最大的時間是「GetDataPromoLines」。這個函數包含簡單的字符串格式。它是從功能「MapForFF」以下循環調用:
foreach (var promoLine in promoLineChunk.PromoLines)
{
outputFile = outputFile + GetDataPromoLines(promoLine, promoLineNumber+1);
promoLineNumber++;
}
的promoLineChunck.PromoLines是描述推廣一類的List,它僅包含私人字符串 - 一個數據庫表中的每一列從中選擇促銷細節。在「GetDataPromoLines」功能的內容可以看出如下:
private string GetDataPromoLines(VW_BT_PROMOTIONSRECORDSELECT promoLine, int sequenceNumber)
{
StringBuilder sb = new StringBuilder();
string seqNum = sequenceNumber.ToString().PadLeft(5, '0');
string uniqueNumber = promoLine.CIMS_PROMO_NUMBER + seqNum;
sb.AppendLine(string.Format("PromoDiscount,\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\"",
uniqueNumber,
promoLine.CIMS_PROMO_NAME,
promoLine.TYPE,
promoLine.DESCRIPTION_,
promoLine.DISCOUNTLEVEL,
promoLine.COUPONNUMBERMIN,
promoLine.COUPONNUMBERMAX,
promoLine.COUPONNUMBERLENGTH
));
sb.AppendLine(string.Format("ItemReq,\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\"",
"00001",
promoLine.IDENTITYTYPE,
promoLine.ITEMNUM,
promoLine.DIVISIONNUM,
promoLine.DEPARTMENTNUM,
promoLine.DEPTGROUPNUM,
promoLine.CLASSNUM,
promoLine.ITEMGROUPNUM,
promoLine.IR_QUANTITY
));
sb.AppendLine(string.Format("TierDefinition,\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\"",
"00001",
promoLine.THRESHOLDTYPE,
promoLine.THRESHOLDQTY,
promoLine.THRESHOLDAMT,
promoLine.DISCTYPE,
promoLine.DISCPCT,
promoLine.DISCAMT,
promoLine.DISCAPPLIESTO,
promoLine.DISCQTY,
promoLine.ADDLINFO
));
return sb.ToString();
}
任何人都可以建議是什麼原因造成的時間來處理指數級增加?這與CLR拆箱有關嗎?
指數衰減幾乎可以肯定算法,所以你應該看看,而不是擔心拳擊。 – Lee
如果您只是調用GetDataPromoLines()而不將結果聯合到outputFile,那麼在性能方面會發生什麼? – Graffito
使用'sb.AppendFormat'在'sb.AppendLine'上加上'string.Format'的情況下 –