Dzam
Dzam личный блог
23 марта 2017, 00:26

Производительность роботов на C# (NinjaTrader).

Производительность роботов на C# (NinjaTrader).

 Производительность роботов на C# (NinjaTrader).
Перед тем, как использовать в своем роботе переменные типа Dictionary или List, если у вас производится частое обращение к ним, обязательно проведите анализ на производительность. Вот мой кусочек анализа.

Для примера описываем переменные:

private List<KeyValuePair<int, string>> listArray;
private Dictionary<int, string> dictArray;

По сути будем иметь набор связок Integer и String. Содержание в данном случае не особо важно. Важно то, что это содержание одинаково в обеих переменных.
А теперь просто заполним эти переменные одинаковыми записями:

// Переменные для замера времени выполнения
sw1 = new Stopwatch();
sw2 = new Stopwatch();

// Инициализация переменных
listArray = new List<KeyValuePair<int, string>>();
dictArray = new Dictionary<int, string>();

// Стартуем замер производительности
sw1.Start();
for (int i = 0; i < 1000000; i++)
{
//Добавляем переменную в массив
    listArray.Add(new KeyValuePair<int, string>(i, "test"));
}

// Останавливаем замер производительности
sw1.Stop();
// Выводим результат
Print("List: " + sw1.ElapsedMilliseconds);
// Очищаем список
listArray.Clear();


// Стартуем второй счетчик производительности
sw2.Start();
// Запускаем второй цикл
for (int i = 0; i < 1000000; i++)
{
    dictArray.Add(i, "test");
}

// Останавливаем счетчик
sw2.Stop();
// Выводим результат
Print("Dictionary: " + sw2.ElapsedMilliseconds);

А вот результат:

List: 33
Dictionary: 73

Я исследовал данный вопрос для своей задачи. Перед применением, обратите внимание на плюсы и минусы относительно ваших целей. Например я читал, что Dictionary медленно добавляет записи, но зато довольно быстро обрабатывает их (поиск, например).

P.S. Также можно ускорить процесс, если во время инициализации определить размер массивов.  Код и замеры не буду писать. Отмечу только, что скорость значительно выше. Проводите эксперименты!!!

Оригинал.
91 Комментарий
  • Зарабатывающий Юзер
    23 марта 2017, 00:49
    А можно узнать конкретную аудиторию этого поста?
    HFT?
    Или ещё что-то?
  • Зарабатывающий Юзер
    23 марта 2017, 00:50
     P.S. Также можно ускорить процесс, если во время инициализации определить размер массивов.


    В иных случаях не является ли это ОБЯЗАТЕЛЬНЫМ УСЛОВИЕМ при написании программы?
  • Андрей К
    23 марта 2017, 01:00
    Есть еще момент. Желательно учитывать какие операции будут использоваться чаще. Чтение/доступ либо модификация списка. Внутри этих контейнеров могут быть реализованы разные структуры и алгоритмы. И какие то заточены для одного, а какие то для другого
  • Андрей К
    23 марта 2017, 01:03
    Прошу прощение, вы про это и написали

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн