【问题标题】:Parallel class in C#C#中的并行类
【发布时间】:2014-12-08 14:33:48
【问题描述】:

我正在使用依赖于 noOFResults 的 for 循环将一个对象复制到另一个对象。我用 Parallel.For 替换了 Foreach 循环以提高性能,但同样会导致主要性能下降。所以我想了解这是什么原因??

 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++;
                }
            }

【问题讨论】:

    标签: c#-4.0 task-parallel-library


    【解决方案1】:

    代码中没有for循环,只有foreach循环。

    不要期望在使用 Parallel.For 时循环会自动变快。

    尤其是当迭代对外部作用域有影响时,迭代几乎不能并行运行。因此,您所添加的只是将迭代拆分为任务的开销。

    外部范围受更改金额的影响。循环内的 k 和 apiSearchResults,仅举几例。

    【讨论】:

    • @Emo 抱歉,我将第一个 foreach 替换为 Parallel.For。我想优化上面的代码,大约需要 350 毫秒才能得到 300 个结果。在这种情况下我能做什么?
    • 正如我所解释的:尝试使迭代彼此独立(不要更改在下一次迭代中使用的迭代中的变量) Parallel.For(Each) 不是灵丹妙药不要指望它会神奇地加速你的代码。
    猜你喜欢
    • 2013-12-18
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2010-10-06
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多