2009-09-27 2 views
1

У вас есть вопрос, как лучше оптимизировать или ускорить процесс. В настоящее время мой код, кажется, работает немного медленно ...C# .net Декоратор шаблона преобразования/установки коллекции

У меня есть следующие классы

public class DataFoo : IFoo { } 

public class Foo 
{ 
    internal IFoo UnderlyingDataObject{get;set;} 

    public Foo(IFoo f) 
    { 
      UnderlyingDataObject = f; 
    } 
} 

Теперь, во многих случаях, я в конечном итоге нужно или вызов метода, который будет предоставлять обратно список. Этот метод первоначально будет получить массив объектов DataFoo и перебрать все возвращаемые объекты инстанцирования нового объекта Foo, проходящий в DataFoo ... Вот пример ...

public List<Foo> GetListOfFoo(Guid id) 
{ 
    DataFoo[] q = GetArrayOfDataFoo(id); 
    List<Foo> rv = new List<Foo>(); 

    for(var i = 0; i < q.Length; i++) 
    { 
      rv.Add(new Foo(q[i])); 
    } 
    return rv; 
} 

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

+2

Профилируйте свой код, чтобы убедиться, что он работает медленно и b) этот код является узким местом? – ChrisF

+0

Я преобразовываю код из существующей linq в sql-реализацию в этот подход, используя nhibernate/fluent nhibernate ... из того, что я вижу, сравнивая две версии; новый код работает медленнее. который медленнее, потому что nhibernate был введен или из-за всех циклов, которые происходят ... – Jason

+1

Используйте профилировщик для проверки узких мест производительности - не догадки; они редко бывают там, где вы ожидаете. Я ожидаю, что изменение ORM-провайдера будет намного более значительным, чем производительность цикла. –

ответ

3

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

Ваше определение GetListOfFoo можно было бы улучшить немного, чтобы избежать ненужного изменения размеров List<Foo>, указав начальную емкость:

DataFoo[] q = GetArrayOfDataFoo(id); 
List<Foo> rv = new List<Foo>(q.Length); 

Но если не вы имеете дело с очень большими массивами и относительно себя с очень малыми периодами времени, то это не будет иметь большого значения.

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

Хотелось посмотреть, что GetArrayOfDataFoo делает. Я предполагаю, что ваша проблема происходит за пределами того, что вы нам показали.

+0

Cheers; Я пропустил преобразование; -p –

+0

GetArrayOfDataFoo использует свободно nhibernate/nhibernate и linq для nhibernate, чтобы просто сделать вызов linq в базе данных и вернуть массив объектов ... – Jason

+0

Тогда я бы сосредоточил вашу энергию на этой области вашего кода, а не шаблона декоратора или преобразования. Это только верхушка айсберга. Используйте профилировщик, чтобы узнать, что происходит. Я считаю, что Айенде Рахиен имеет профилировщик NHibernate, но я не использовал его сам. –

Смежные вопросы