2010-07-13 1 views
1

다음 코드에서는 시나리오 1의 자세한 정보를 매우 좋아하지만 시나리오 2와 비교할 때 얼마나 큰 성능이 걸리는지 알고 싶습니다. 루프의 인스턴스 생성은 큰 문제입니까?루프의 인스턴스화 : 자세한 표시와 성능 비교

성능에 영향을 미친 가치있는 구문상의 이점 (일부는 장황하거나 최적이라고 생각하지 않을 수도 있습니다)이 있습니까? 컬렉션은 합리적으로 작다고 가정 할 수 있습니다 (N < 수백).

// First scenario 
var productCategoryModels = new List<ProductCategoryModel>(); 
foreach (var productCategory in productCategories) 
{ 
    var model = new ProductCategoryModel.ProductCategoryModelConverter(currentContext).Convert(productCategory); 
    productCategoryModels.Add(model); 
} 

// Second scenario 
var productCategoryModels = new List<ProductCategoryModel>(); 
var modelConvert = new ProductCategoryModel.ProductCategoryModelConverter(currentContext); 

foreach (var productCategory in productCategories) 
{ 
    var model = modelConvert.Convert(productCategory); 
    productCategoryModels.Add(model); 
} 

나는이 사실을 종종 알기에 사람들의 생각을 듣고 싶습니다.

+0

자세한 정보가 아닌 명확성을 위해 최적화해야합니다. –

답변

8

이 질문에 조금 다르게 접근 할 것입니다. new ProductCategoryModel.ProductCategoryModelConverter(currentContext)에서 일어나는 일이 루프 중에 변경되지 않으면 루프 내에 포함 할 이유가 없습니다. 루프의 일부가 아닌 경우에는 거기에 없어야합니다.

더보기 좋게 표시하기 때문에 포함 시키면 차이가 있는지 없는지 알아 내야합니다.

+1

흥미 롭군요, 아마 그것이 내가 생각한 것처럼 장황하지는 않을 것입니다. 최종 객체의 개념은 상태를 변경하지 않고 고려하지 않았습니다. –

+0

@ 브래드 헬러 : 나는 그럴 수 있다고 말할 수는 없지만 두 사람을 똑같이 비교하고 있기 때문에 필요 없다고 생각합니다. –

1

두 형식 중 가장 만족스러운 형식을 유지하십시오. 성능 문제가 발생할 경우 나중에 최적화하십시오.

6

Brian처럼 실제로 변경하지 않으면 새 인스턴스를 만들 필요가 없습니다. Convert은 원본 개체를 변경하지 않는다고 가정합니다.

나는 (자신의 코드의 관점에서) 완전히하지만 루프를 방지하기 위해 LINQ를 사용하는 것이 좋습니다 것 :

var modelConverter = new ProductCategoryModelConverter(currentContext); 
var models = productCategories.Select(x => modelConverter.Convert(x)) 
           .ToList(); 

성능의 측면에서, 그것은 ProductCategoryModelConverter의 생성자가해야 할 일을했을 무엇에 따라 달라집니다. 새 객체를 만드는 것만으로도 오버 헤드 측면에서 상당히 저렴합니다. 물론 무료는 아니지만 대부분의 경우 병목 현상이 발생할 것으로 예상하지는 않습니다. 그러나, 나는 그것을 루프에서 인스턴스화 그것이 필요하다는 것을 암시겠습니까; 거기에 어떤 이유가있다 단지 하나의 개체를 사용합니다. A 변환기 확실히 같은 소리가 그 일을 그대로 유지됩니다 뭔가를 좋아해요 ... 그래서 인스턴스화 -에 - 루프 버전에 의해 의아해 것입니다.

+0

오, 링크 사용은 정말 좋은 생각입니다! 나는 linq을 오랜 시간 동안 피했는데, 이것은 내 작업 흐름에서 작업 할 때 낮은 매달린 과일입니다! –

+2

@ 브래드 : LINQ는 많은 것들을 위해 훌륭합니다. LINQ to SQL 등 (어떤 것이 효과가 있을지 예측하기가 어려울 수있는 곳)에 대한 경각심을 이해할 수는 있지만 요즘 LINQ to Objects는 당연한 생각입니다. 나는 C#없이 간신히 기억할 수있다. –

+0

LINQ를 이해합니다. 코드가 약간 유지 보수가되지 않을까 걱정됩니다. 이 유형의 LINQ 구문은 훌륭합니다. '(제품에서 convert.Convert (p)를 선택하십시오.) ToList();와 같이 SQL-ish 구문을 사용하면 더 이상 문제가되지 않습니다. –