Вопрос

Quandry - какой из следующих двух методов лучше всего работает
Цель - Получите объект типовой обертки (определено ниже)
Критерии - скорость над хранением
нет. записей - около 1000 - около 2000, максимум около 6K
Выбор - создайте объект на лету или сделайте поиск из словаря
Скорость выполнения - называется X раз в секунду

Nb - мне нужно сначала доставить рабочий код, а затем сделать оптимизацию, следовательно, если какие -либо теоретики смогут дать проблески информации о сцене, что поможет, прежде чем я пройду фактический тест на производительность, возможно, от Eod thu

Определения -

class Wrapper  
{  
   public readonly DataRow Row;  
   public Wrapper(DataRow dr)  
   {  
      Row = dr;  
   }  
   public string ID { get { return Row["id"].ToString(); } }  
   public string ID2 { get { return Row["id2"].ToString(); } }  
   public string ID3 { get { return Row["id3"].ToString(); } }  
   public double Dbl1 { get { return (double)Row["dbl1"]; } }  
   // ... total about 12 such fields !  
}  
Dictionary<string,Wrapper> dictWrappers;  

Метод 1

Wrapper o = new Wrapper(dr);  
/// some action with o
myMethod( o );

Метод 2

Wrapper o;    
if ( ! dictWrappers.TryGetValue( dr["id"].ToString(), out o ) )    
{    
    o = new Wrapper(dr);    
    dictWrapper.Add(o.ID, o);    
}    

/// some action with o    
myMethod( o );    
Это было полезно?

Решение

Первый был бы быстрее, поскольку на самом деле он не делает поиск, он просто делает простое распределение и задание.

Два сегмента кода не почти эквивалентны. В функции, однако, потому что метод 1 может создать много дубликатов.

Другие советы

  1. Никогда не оптимизируйтесь без профилирования в первую очередь.
  2. Никогда не профилируйте, если код не соответствует спецификациям/ожиданиям.
  3. Если вам нужно профилировать этот код, напишите его в обоих направлениях и сравните его с ожидаемой нагрузкой.

РЕДАКТИРОВАТЬ: Я стараюсь отдать предпочтение следующему по поводу оптимизации, если производительность не является неприемлемой:

  • Простота
  • Читаемость
  • Обслуживание
  • Тестируемость

Я (недавно) видел высоко оптимизированный код, о котором было очень трудно отлаживать. Я реформировал его, чтобы упростить его, а затем запустил тесты производительности. Производительность была неприемлемой, поэтому я профилировал его, нашел узкие места и оптимизировал только те. Я переоценил тесты производительности, и новый код был сопоставим с высокооптимизированной версией. И теперь гораздо проще поддерживать.

Без фактического тестирования я ожидаю, что кэширование значений поля в обертке (то есть избегание всех вызовов и актеров ToString), вероятно, окажет большее влияние на производительность.

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

Предполагая, что ты В самом деле Обеспокоенный (эй, это происходит), тогда ваша основная обертка может быть улучшена. Вы делаете поиск поля по строке. Если вы собираетесь сделать звонок с тем же полем, установленным в ряду, на самом деле быстрее кэшировать ординалы и смотреть вверх по порядку.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top