C# 4.0 C语言中的并行类#
我正在使用依赖于noOFResults的for循环将一个对象复制到另一个对象。我用Parallel.For替换了Foreach循环以提高性能,但同样会导致主要性能下降。所以我想知道这是什么原因C# 4.0 C语言中的并行类#,c#-4.0,task-parallel-library,C# 4.0,Task Parallel Library,我正在使用依赖于noOFResults的for循环将一个对象复制到另一个对象。我用Parallel.For替换了Foreach循环以提高性能,但同样会导致主要性能下降。所以我想知道这是什么原因 int resultCount = 0; var apiSearchResults = new PS_HotelSearchResult[results.Count]; foreach (BE_HotelSearchResult result in results)
int resultCount = 0;
var apiSearchResults = new PS_HotelSearchResult[results.Count];
foreach (BE_HotelSearchResult result in results)
{
apiSearchResults[resultCount] = new PS_HotelSearchResult();
#region Fields of First Search
apiSearchResults[resultCount].RateType = (PS_RateType)result.RateType;
apiSearchResults[resultCount].HotelCode = result.HotelCode;
apiSearchResults[resultCount].Discount = result.AmountBeforeDiscountInSupplierCurr -
result.AmountAfterTaxInSupplierCurr;
apiSearchResults[resultCount].AmountAfterTax = result.AmountAfterTaxInSupplierCurr;
apiSearchResults[resultCount].AmountBeforeTax = result.AmountBeforeTaxInSupplierCurr;
apiSearchResults[resultCount].Currency = result.CurrencySupplier;
apiSearchResults[resultCount].IsUniversalApiResult = true;
if (result.Price != null)
{
apiSearchResults[resultCount].TotalGP = result.Price.TotalGP;
}
#endregion
#region Fields for Room
if (!Equals(result.RoomDetails, null))
{
int roomCount = 0;
apiSearchResults[resultCount].RoomDetails =
new PS_HotelRoomsDetails[result.RoomDetails.Length];
foreach (BE_HotelRoomsDetails roomDetail in result.RoomDetails)
{
if (roomDetail.CancellationPolicies == null)
{
throw new BusinessServiceException("HotelPrice.GetPrice - CancellationPolicies SHOULD NOT BE Null for rooms");
}
apiSearchResults[resultCount].RoomDetails[roomCount] = new PS_HotelRoomsDetails
{
SequenceNo = roomDetail.SequenceNo,
#region ExtraGuestCharge and ChildCharges
// Multiplied by number of nights becuase its a day wise price and we are setting it roomwise
SellExtraGuestCharges = roomDetail.SellExtraGuestCharges,
PubExtraGuestCharges = roomDetail.PubExtraGuestCharges,
ChildCharges = roomDetail.ChildCharges,
SellChildCharges = roomDetail.SellChildCharges,
#endregion
#region Discount and Tax
Discount = roomDetail.Discount,
TotalTax = roomDetail.TotalTax,
#endregion
};
int k = 0;
#region DayWiseRate
if (!Equals(roomDetail.Rates, null))
{
apiSearchResults[resultCount].RoomDetails[roomCount].Rates =
new PS_RoomRates[roomDetail.Rates.Length];
foreach (BE_RoomRates rate in roomDetail.Rates)
{
apiSearchResults[resultCount].RoomDetails[roomCount].Rates[k] = new PS_RoomRates
{
Amount = rate.Amount,
//Pricing is wrong
//SellingFare = rate.SellingFare
};
k++;
}
}
#endregion
k = 0;
#region Additional Charges
if (!Equals(roomDetail.AdditionalCharges, null))
{
apiSearchResults[resultCount].RoomDetails[roomCount].AdditionalCharges =
new PS_AdditionalCharges[roomDetail.AdditionalCharges.Count];
foreach (
BE_AdditionalCharges additionalCharge in
roomDetail.AdditionalCharges)
{
apiSearchResults[resultCount].RoomDetails[roomCount].AdditionalCharges[k] = new PS_AdditionalCharges
{
Charge = additionalCharge.Charge,
IncludedInTotal = additionalCharge.IncludedInTotal
};
k++;
}
}
#endregion
#region Price and Price Component
apiSearchResults[resultCount].RoomDetails[roomCount].Price = new HotelPriceAccounts();
if (!Equals(roomDetail.Price, null))
{
apiSearchResults[resultCount].RoomDetails[roomCount].Price.Discount = roomDetail.Price.Discount;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.PublishedFare = roomDetail.Price.PublishedFare;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.Tax = roomDetail.Price.Tax;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.OtherCharge = roomDetail.Price.OtherCharges;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.TotalGP = roomDetail.Price.TotalGP;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.IsGPEnabled = roomDetail.Price.IsGPEnabled;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.AgentMarkUpType =
(AgentMarkUpType)roomDetail.Price.AgentMarkUpType;
apiSearchResults[resultCount].RoomDetails[roomCount].Price.PriceId = roomDetail.Price.PriceId;
}
#endregion
roomCount++;
}
}
代码中没有for循环,只有foreach循环 使用Parallel.For时,不要期望循环自动更快 特别是当迭代对外部范围有影响时,迭代很难并行运行。因此,您所添加的只是在任务之间划分迭代的开销
外部范围受数量变化的影响。循环中的k和apiSearchResults,仅举几个例子。@Emo抱歉,我用Parallel.For替换了first foreach。我想优化上面的代码,大约需要350毫秒才能得到300个结果。在这种情况下我能做什么?正如我所解释的:尝试使迭代相互独立(不要在下一次迭代中使用的迭代中更改变量)。因为(每个)不是一个魔弹,不要期望它神奇地加速代码。