【发布时间】:2019-12-14 19:00:47
【问题描述】:
我该怎么做才能使这个循环运行得更快?
private void accessVendorGridData()
{
try
{
foreach (var item in getAllVendorList)
{
item.CurrencyName = "USD";
// Fetch Addresses in Vendor Grid
var Addr = _vendorservice.GetAllVendorAdd().Where(x => x.vendorId == item.Id).ToList();
if (Addr.Count > 0)
{
item.VendorAddressLine = String.Format("{0}, {1}, {2}, {3}, {4}", Addr[0].Address, Addr[0].City, Addr[0].StateProvince, Addr[0].ZipPostalCode, Addr[0].CountryRegion);
}
// Fetch Payment terms in Vendor Grid
var paymentTerm = _vendorservice.GetAllPaymentTerms().Where(x => x.Id == item.PaymentTermId).ToList().SingleOrDefault();
if (paymentTerm != null)
{
item.paymenttermitem = paymentTerm.Name;
}
// Fetch Tax Scheme in Vendor Grid
var taxscheme = _vendorservice.GetAllTaxScheme().Where(x => x.Id == item.TaxschemeId).ToList().SingleOrDefault();
if (taxscheme != null)
{
item.TaxschemeName = taxscheme.TaxSchemaName;
}
}
}
catch (Exception ex)
{
_exLog.AddErrorLog(ex, "NewVendor, accessVendorGridData()");
ModernDialog.ShowMessage(ex.Message, "Error!", MessageBoxButton.OK);
}
}
我能做些什么来让这个循环运行得更快?我尝试了 Parallel.ForEach 但在两者之间迷路了。有人可以帮忙吗?
private void accessVendorGridData()
{
foreach (var item in getAllVendorList)
{
var Addr = _vendorservice.GetAllVendorAdd().Where(x => x.vendorId == item.Id).ToList();
var paymentTerm = _vendorservice.GetAllPaymentTerms().Where(x => x.Id == item.PaymentTermId).ToList().SingleOrDefault();
var taxscheme = _vendorservice.GetAllTaxScheme().Where(x => x.Id == item.TaxschemeId).ToList().SingleOrDefault();
}
}
【问题讨论】:
-
首先要做的是:测量该循环是否真的是一个瓶颈,或者如果你只是感觉到它很慢,因为通过调试器单步执行每一行需要一些时间。除此之外,我们无法回答这个问题,因为我们不知道循环中的方法是做什么的,以及这些方法是否会导致性能不佳。长篇大论:使用分析器,例如点追踪。
-
从删除 materialization 开始:
.ToList()但改用Any()。 -
为了得到准确的答案,我们还需要知道
vendorservice内部做了什么 -
.ToList().SingleOrDefault()变成.SingleOrDefault()不需要在ToList()当你想要单品时 -
您似乎在每次迭代时都在调用
GetAllVendorAdd、GetAllPaymentTerms和GetAllTaxScheme。您可以考虑从循环中提取此通用代码并将其结果具体化为列表或数组。
标签: c# multithreading performance for-loop foreach