Самое быстрое преобразование MFC CArray <int>в список <int>в Managed C ++ - PullRequest
0 голосов
/ 15 марта 2012

В настоящее время мы находимся в процессе изменения большого количества кода при переходе от «единого системного» приложения к тому, которое может выполнять задачи на узлах распределенной обработки.Существующий код представляет собой смесь неуправляемого и теперь управляемого кода C ++, но также использует код C # для обеспечения интерфейса WCF между узлом и контроллером.

В результате этого перемещения общий шаблон кода I 'Видение, которое, вероятно, останется в обозримом будущем, представляет собой базовое преобразование значений целочисленного идентификатора из массива MFC в управляемый список для включения сериализации через WCF.Текущий шаблон:

List<int>^ fixtures = gcnew List<int>(aFixtureIds.GetCount());

for(int i = 0; i < aFixtureIds.GetCount(); i++) //aFixtureIds is of MFC type CArray<int,int>
    {
        fixtures->Add(aFixtureIds[i]);
    }

Мы также используем нечто подобное в обратном порядке, где, если возвращается список, мы можем преобразовать его в CIntArray для вызывающей функции, выполняя итерацию по нему в цикле и вызывая Add.

Я понимаю, что вышеприведенное выглядит не очень интенсивно, но его часто вызывают - есть ли лучший шаблон для выполнения этого базового преобразования List <-> CArray, который бы занимал меньше времени на обработку?Это тот код, который может быть эффективно оптимизирован компилятором (я подозреваю, что нет, но хочу быть исправленным)?Размеры списков различаются, но обычно они составляют от 1 до десятков тысяч элементов, возможно, больше.

1 Ответ

0 голосов
/ 15 марта 2012

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

  • Мера: Я полагаю, что это устаревает, потому что в каждом вопросе о производительности люди просто говорят«сначала измерить», но это обычно (всегда?) хороший совет, особенно в этом случае.Боюсь, что вы сильно переоцениваете, сколько времени занимает такое преобразование на современном настольном компьютере.Например, на моем настольном 4-летнем рабочем столе Pokey я могу добавить 100 миллионов целых чисел в CArray всего за 250 мс.Я бы ожидал примерно такую ​​же производительность в C # для списка.Это означает, что запуск вашего списка из 10000 элементов займет около 25 микросекунд.Теперь, очевидно, если вы делаете это тысячи раз в секунду или для миллиардов элементов, это становится проблемой, хотя решением в этих случаях будет не более быстрый алгоритм, а лучший.
  • Update WhenНеобходимо: Обновлять массивы только тогда, когда вам действительно нужна информация.Если вы часто обновляете только потому, что вам «это может понадобиться», скорее всего, вы теряете конверсии, которые никогда не используются.
  • Синхронизируйте обновления: Вместо обновления всего массива одновременно обновитеэлементы в обеих копиях списков одновременно.
  • Просто используйте один список: Хотя это звучит так, как будто вы не можете этого сделать, хотя бы попробуйте использовать один список вместо двух копий одной и той же информации.Скройте доступ к элементу в функции / методе / классе, чтобы вам не нужно было знать, хранятся ли данные в CArray <> или List <>.
  • Улучшенный дизайн / алгоритм: Если вы измеряете и обнаруживаете, что на это преобразование тратится много времени, то, вероятно, вы получите гораздо лучший результат, улучшив коддизайн, чтобы уменьшить или устранить необходимые преобразования.Вообще-то, возможно, не так много улучшений, если просто скопировать CArray <> в список <>.
...