|
Boost Users : |
From: bringiton bringiton (kneeride_at_[hidden])
Date: 2006-07-12 00:48:37
I'm just wondering what your thoughts are on my findings.
I need a container that meets the following:
- forward iteration only
- insert to end only
- no random access
- delete from any position
- average size of list will be 64 items
I would first say use list over vector. because no random access and
delete from any position. I ran some performance tests, which proved
otherwise.
The test builds a list by inserting to end. And then removes all items
from the front until size == 0. (note: removing from index [0] should
provide worst case linear complexity for vector)
Here are my finding for containers of size 64, 256 and 1024. first
result uses vector, 2nd uses list. i ran the test in release mode in
ms vc++ 6.
Test build/remove 64
0.062
0.234
Test build/remove 256
0.422
0.938
Test build/remove 1024
5.844
3.75
- it seems vector is best for smaller lists. even at 256 items, the
vector is twice as fast at building at contant time and deleting and
worst case linear time.
- is this strange behaviour? is my test correct or do i have a bug?
- i am also curious to how this runs on other compilers (esp later
version of ms vc++)
For those curious, here is my code. feel free to pick at it ;)
void TestVectBuildDelete(int redoCount, int listSize)
{
boost::timer t;
for (int i = 0; i < redoCount; i++) {
// build the list
std::vector<int> vect;
for (int j = 0; j < listSize; j++) {
vect.push_back(j);
//vect.insert(vect.begin(), j); //.push_front(j);
}
// remove all elements in list
while (!vect.empty()) {
vect.erase(vect.begin());
}
}
std::cout << t.elapsed() << std::endl;
}
void TestListBuildDelete(int redoCount, int listSize)
{
boost::timer t;
for (int i = 0; i < redoCount; i++) {
// build the list
std::list<int> vect;
for (int j = 0; j < listSize; j++) {
vect.push_back(j);
}
// remove all elements in list
while (!vect.empty()) {
vect.pop_front();
}
}
std::cout << t.elapsed() << std::endl;
}
void Test()
{
std::cout << "Test build/remove 64" << std::endl;
TestVectBuildDelete(10000, 64);
TestListBuildDelete(10000, 64);
std::cout << "Test build/remove 256" << std::endl;
TestVectBuildDelete(10000, 256);
TestListBuildDelete(10000, 256);
std::cout << "Test build/remove 1024" << std::endl;
TestVectBuildDelete(10000, 1024);
TestListBuildDelete(10000, 1024);
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net