C# Вопрос о производительности
-
19-09-2019 - |
Вопрос
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 может создать много дубликатов.
Другие советы
- Никогда не оптимизируйтесь без профилирования в первую очередь.
- Никогда не профилируйте, если код не соответствует спецификациям/ожиданиям.
- Если вам нужно профилировать этот код, напишите его в обоих направлениях и сравните его с ожидаемой нагрузкой.
РЕДАКТИРОВАТЬ: Я стараюсь отдать предпочтение следующему по поводу оптимизации, если производительность не является неприемлемой:
- Простота
- Читаемость
- Обслуживание
- Тестируемость
Я (недавно) видел высоко оптимизированный код, о котором было очень трудно отлаживать. Я реформировал его, чтобы упростить его, а затем запустил тесты производительности. Производительность была неприемлемой, поэтому я профилировал его, нашел узкие места и оптимизировал только те. Я переоценил тесты производительности, и новый код был сопоставим с высокооптимизированной версией. И теперь гораздо проще поддерживать.
Вот бесплатный Профилирование инструмента.
Без фактического тестирования я ожидаю, что кэширование значений поля в обертке (то есть избегание всех вызовов и актеров ToString), вероятно, окажет большее влияние на производительность.
Затем, как только вы кэшируете эти значения, вы, вероятно, захотите оставить экземпляры обертки, а не воссоздать их.
Предполагая, что ты В самом деле Обеспокоенный (эй, это происходит), тогда ваша основная обертка может быть улучшена. Вы делаете поиск поля по строке. Если вы собираетесь сделать звонок с тем же полем, установленным в ряду, на самом деле быстрее кэшировать ординалы и смотреть вверх по порядку.
Конечно, это только в том случае, если вам действительно нужно беспокоиться о производительности, и случаи, когда это будет иметь значение, довольно редки (хотя в встроенных устройствах это не так редко, как на рабочем столе).