Случайное замедление при произвольной вставке элементов в векторы

РЕДАКТИРОВАТЬ:
Я исправил вставку. Как любезно упомянул Blastfurnace, вставка аннулировала итераторы. Я считаю, что для сравнения производительности необходим цикл (см. Мой комментарий к ответу Blastfurnance). Мой код обновлен. У меня есть полностью аналогичный код для списка только с вектором, замененным списком. Однако с помощью кода я обнаружил, что список работает лучше, чем вектор, как для маленьких, так и для больших типов данных, и даже для линейного поиска (если я удаляю вставку). В соответствии с http://java.dzone.com/articles/c-benchmark-%E2%80%93-stdvector-vs и другие сайты, которые не должны иметь место. Любые подсказки, как это может быть?

Я беру курс по программированию математического программного обеспечения (экзамен в понедельник) и для этого я хотел бы представить график, который сравнивает производительность между случайной вставкой элементов в вектор и список. Однако, когда я тестирую код, я получаю случайные замедления. Например, у меня может быть 2 итерации, где вставка 10 случайных элементов в вектор размером 500 занимает 0,01 секунды, а затем 3 аналогичных итерации, каждая из которых занимает примерно 12 секунд. Это мой код:

    void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)  {
int i = 0;

vector<FillSize>::iterator iter = myContainer.begin();

while (iter != myContainer.end())
{
if (i == place)
{
FillSize myFill;
iter = myContainer.insert(iter, myFill);
}
else
++iter;

++i;
}

//cout << i << endl;
}

double testVector(int containerSize, int iterRand)
{
cout << endl;
cout << "Size: " << containerSize << endl << "Random inserts: " << iterRand << endl;

vector<FillSize> myContainer(containerSize);
boost::timer::auto_cpu_timer tid;

for (int i = 0; i != iterRand; i++)
{
double randNumber = (int)(myContainer.size()*((double)rand()/RAND_MAX));
AddRandomPlaceVector(myContainer, randNumber);
}

double wallTime = tid.elapsed().wall/1e9;

cout << "New size: " << myContainer.size();

return wallTime;
}

int main()
{
int testSize = 500;
int measurementIters = 20;
int numRand = 1000;
int repetionIters = 100;ofstream tidOutput1_sum("VectorTid_8bit_sum.txt");
ofstream tidOutput2_sum("ListTid_8bit_sum.txt");

for (int i = 0; i != measurementIters; i++)
{
double time = 0;

for (int j = 0; j != repetionIters; j++) {
time += testVector((i+1)*testSize, numRand);
}

std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput1_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}

for (int i = 0; i != measurementIters; i++)
{
double time = 0;

for (int j = 0; j != repetionIters; j++) {
time += testList((i+1)*testSize, numRand);
}

std::ostringstream strs;
strs << double(time/repetionIters);
tidOutput2_sum << ((i+1)*testSize) << "," << strs.str() << endl;
}
return 0;
}

struct FillSize
{
double fill1;
};

Структура просто для меня, чтобы легко добавить больше значений, чтобы я мог проверить элементы с различным размером. Я знаю, что этот код, вероятно, не идеален в отношении тестирования производительности, но они скорее заставили бы меня сделать простой пример, чем просто ссылку на то, что я нашел.

Я тестировал этот код на двух компьютерах, у которых были одинаковые проблемы. Как это может быть? И можете ли вы помочь мне с исправлением, чтобы я мог составить график и представить его в понедельник? Возможно, добавление нескольких секунд ожидания между каждой итерацией поможет?

С уважением,
Бьярке

1

Решение

Ваш AddRandomPlaceVector Функция имеет серьезный недостаток. С помощью insert() будут аннулировать итераторы Итак for Цикл неверный код.

Если вы знаете желаемую точку вставки, нет смысла перебирать vector совсем.

void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)
{
FillSize myFill;
myContainer.insert(myContainer.begin() + place, myFill);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]