Есть ли способ сделать std::vector
быстрее на reserving + resizing
?C++ - STL vector question
Я хотел бы достичь производительности, которая была бы несколько эквивалентна обычным массивам C.
Смотрите следующие фрагменты кода:
TEST(test, vector1) {
for (int i = 0; i < 50; ++i) {
std::vector<int> a;
a.reserve(10000000);
a.resize(10000000);
}
}
TEST(test, vector2) {
for (int i = 0; i < 50; ++i) {
std::vector<int> a(10000000);
}
}
TEST(test, carray) {
for (int i = 0; i < 50; ++i) {
int* new_a = new int[10000000];
delete[] new_a;
}
}
Первые два теста два раза медленнее (4095 ms vs 2101 ms
) и, очевидно, что происходит потому, что std::vector
является обнуление элементов в нем. Любые идеи о том, как этого можно избежать?
Возможно, существует какой-то стандарт (boost?) контейнер, который реализует массив с фиксированным размером и кучей?
Спасибо
Для того, чтобы тесты выполняли одинаковый объем работы, для теста 'carray' требуется значение' for (std :: size_t idx = 0; idx <10000000; ++ idx) new_a [idx] = 0; ' там. Как только это произойдет, я сомневаюсь, что вы найдете значительные изменения. – sbi
Я предлагаю использовать профилировщик, и только если производительность низкая оптимизация. Вышеприведенный код, вероятно, не присутствует в обычном приложении. Вы бы так не делали. Возможно, лучший способ - создать свой собственный класс массива, чтобы иметь больше контроля. – INS
@Iulian: Это один из тех комментариев, для которых я хочу иметь возможность проголосовать за комментарии. Почему бы вам создать собственный массив?Вы на самом деле пытались реализовать 'std :: vector'? Вы обнаружите, что на удивление трудно придумать, как правильно, так и быстро. – sbi