РЕДАКТИРОВАТЬ:
Я исправил вставку. Как любезно упомянул 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;
};
Структура просто для меня, чтобы легко добавить больше значений, чтобы я мог проверить элементы с различным размером. Я знаю, что этот код, вероятно, не идеален в отношении тестирования производительности, но они скорее заставили бы меня сделать простой пример, чем просто ссылку на то, что я нашел.
Я тестировал этот код на двух компьютерах, у которых были одинаковые проблемы. Как это может быть? И можете ли вы помочь мне с исправлением, чтобы я мог составить график и представить его в понедельник? Возможно, добавление нескольких секунд ожидания между каждой итерацией поможет?
С уважением,
Бьярке
Ваш AddRandomPlaceVector
Функция имеет серьезный недостаток. С помощью insert()
будут аннулировать итераторы Итак for
Цикл неверный код.
Если вы знаете желаемую точку вставки, нет смысла перебирать vector
совсем.
void AddRandomPlaceVector(vector<FillSize> &myContainer, int place)
{
FillSize myFill;
myContainer.insert(myContainer.begin() + place, myFill);
}
Других решений пока нет …