2013-08-28 3 views
0

У меня есть набор из примерно 150 переменных, которые могут иметь различный тип (double, bool, array). Этот набор переменных мне нужно упаковать в QVector. Из-за переменных типа переменных я думал об использовании QVariant. Пока это мой дизайн. Я не уверен, что это производительность + механизм поиска myVariables.QVector with struct - performance + best practice

enum class VariableEnums{ 
    VAR1, 
    VAR2, 
    VAR3 
}; 

struct myVariable{ 
    VariableEnums var; 
    QVariant value; 
}; 

QVector<myVariable> myVariables; 

Идея состоит в том, что myVariables будут отправлены на несколько модулей. Каждый модуль найдет определенную переменную и обновит некоторую другую переменную. Таким образом, один модуль может обновлять переменную, которая будет использоваться другим модулем. До сих пор по поиску определенной переменной я могу думать только следующее:

foreach(myVariable *myVar, myVariables{ 
    if(myVar->var == VariableEnums::VAR1){ 
    //...... 
    continue; 
    } 
} 

Есть ли еще более эффективный способ сделать это? Я мог бы использовать indexOf, но я не уверен, как использовать его со структурой.

спасибо, m.

+0

Вы должны профиль его. Таким образом, вы будете знать эффективность этого выбора в своей системе. Это также возможность построить 'QVector ', 'QVector ', ... и передавать их по мере необходимости. Кажется, что ваш код страдает от амнезии, потому что вы знали, что тип забыл об этом. – andre

+0

Соединяете ли вы отдельный тип с каждым из VAR1-VAR3? Если да, почему бы просто не сохранить три отдельных списка значений и работать только с значениями в определенной категории? Это не только избавит вас от поиска в гетерогенном контейнере, но также устранит накладные расходы QVariant во время выполнения. Если вам абсолютно не нужен один гетерогенный контейнер, конечно. – thokra

ответ

0

После выполнения некоторого профилирования оказалось, что QVector с структурой перечислений является самой быстрой комбинацией. QVector

Я попытался QHash, QMap и для держателей данных QString и QVariant

тест:

...searching in dataset size: 1090000 
testing < QVector<struct enum> > case time (ms): 242 
testing < QVector<struct QString> > case time (ms): 1220 
testing < QMap<enum, QVariant> > case time (ms): 3458 
testing < QHash<enum, QVariant> > case time (ms): 2167 
0

вы можете рассмотреть возможность использования multimap вместо QVector. С Multimap вы можете отобразить переменные, как:

Сырая представление:

{ 
    VAR1, a 
    VAR1, b 
    VAR2, c 
    VAR1, d 
    VAR3, e 
    etc... 
} 

Затем вы можете использовать MultiMap :: equal_range() функция, чтобы получить набор переменных с одинаковым «ключом», например, переменные с ключом «VAR1».

Я не уверен, есть ли QMultimap, но есть definatley QMap, который я не смотрел. Но если не просто использовать стандартную C++ multimap.

+0

Насколько я знаю, с точки зрения производительности QVector быстрее, чем QMap, поэтому я больше думаю о QVector – miro

+0

@MiroKarpis. В этом случае я не уверен, что производительность лучше для вектора. Multimap сохраняет элементы, отсортированные по ключу. Поэтому, когда ему нужно извлечь элементы с помощью функции equal_range(), он может сделать это довольно быстро (быстрее, чем вектор, если есть много результатов для поиска). Однако вектор, вероятно, быстрее для добавления/удаления элементов или доступа к одному элементу по индексу ... это зависит от того, где вы хотите оптимизировать свою производительность .... мне кажется, что вы хотите оптимизировать получение результатов быстро :) –

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

  • Нет связанных вопросов^_^