как улучшить производительность функции, которая занимает почти 1 секунду во время загрузки (asp.net mvc 3) - PullRequest
1 голос
/ 15 декабря 2011

Я провел трассировку профиля, чтобы проверить, какие функции занимают много времени. Один из методов занимает около 1 секунды и вызывается более 10 раз, и я думаю, что он должен быть кандидатом на проверку. Я включил метод, Может кто-нибудь сказать мне, как это можно улучшить.

 [NonAction]
    private ProductModel.ProductMiscModel PrepareProductMiscModel(Product product)
    {
        if (product == null)
            throw new ArgumentNullException("product");

        var model = new ProductModel.ProductMiscModel();
        var productVariants = _productService.GetProductVariantsByProductId(product.Id);
        var getManufactureImage = _manufacturerService.GetProductManufacturersByProductId(product.Id)
           .Select(x =>
           {
               var m = x.Manufacturer.ToModel();
               m.PictureModel.ImageUrl = _pictureService.GetPictureUrl(x.Manufacturer.PictureId, _mediaSetting.ManufacturerThumbPictureSize, true);
               m.PictureModel.Title = string.Format(_localizationService.GetResource("Media.Manufacturer.ImageLinkTitleFormat"), m.Name);
               m.PictureModel.AlternateText = string.Format(_localizationService.GetResource("Media.Manufacturer.ImageAlternateTextFormat"), m.Name);
               return m;
           })
           .ToList();
        model.manufactureName = getManufactureImage;
        switch (productVariants.Count)
        {
            case 0:
                {
                    //var productVariant = productVariants[0];
                    model.Sku = null;
                    model.ShowSku = false;
                   // model.attributeName = 0;
                } break;
            case 1:
                //only one variant
                {               var productVariant = productVariants[0];
                                model.Sku = productVariant.Sku; //null;
                                model.ShowSku = true;
                               // model.attributeName = _productAttributeService.GetProductVariantAttributesByProductVariantId(productVariant.Id);
                                model.productSpecification = _specificationAttributeService.GetProductSpecificationAttributesByProductId(productVariant.Product.Id);
                }
                break;

        }

        return model;
    }

_manufactureService.GetProductManufactureByProductId

public virtual IList<ProductManufacturer> GetProductManufacturersByProductId(int productId, bool showHidden = false)
    {
        if (productId == 0)
            return new List<ProductManufacturer>();

        string key = string.Format(PRODUCTMANUFACTURERS_ALLBYPRODUCTID_KEY, showHidden, productId);
        return _cacheManager.Get(key, () =>
                                          {
                                              var query = from pm in _productManufacturerRepository.Table
                                                          join m in _manufacturerRepository.Table on
                                                              pm.ManufacturerId equals m.Id
                                                          where pm.ProductId == productId &&
                                                                !m.Deleted &&
                                                                (showHidden || m.Published)
                                                          orderby pm.DisplayOrder
                                                          select pm;
                                              var productManufacturers = query.ToList();
                                              return productManufacturers;
                                          });
    }

1 Ответ

1 голос
/ 15 декабря 2011

Используйте StopWatch в методе, чтобы определить, какая часть занимает много времени.

Вы можете захотеть включить URL-адрес изображения в исходный список вместо обхода каждого элемента и вызова _pictureService.GetPictureUrl.

...