Re: help with vector<vector<double>>
T. Crane wrote:
:: On Aug 10, 4:44 pm, "Bo Persson" <b...@gmb.dk> wrote:
::: T. Crane wrote:
:::
::::: So I was curious to see which is faster -- pushing back onto a
::::: vector or using direct index access of the elements. I declare
::::: a std::vector<int> v, setting the number of elements to vSize.
::::: I set the values using a for-loop. Then, I declare two
::::: std::vector<vector<int> > objects, m1 & m2. The first of these
::::: I initialize with mSize elements, and the second I use the
::::: std::vector::reserve method to claim mSize space. The using two
::::: for- loops I populate m1 & m2 using direct index accessing of
::::: the elements to set them equal to v, and then I use push_back
::::: to fill m2. I time these two for-loops as well as the whole
::::: function.
::::: What I find (perhaps not suprisingly) is that I fill m1 much,
::::: much faster, i.e. push_back() with reserve() are SLOW. Anyway,
::::: here's the code. Nothing to special.
:::::
::::: #include <vector>
::::: #include <iostream>
::::: #include <iomanip>
::::: #include <time.h>
:::::
::::: using namespace std;
:::::
::::: int main(){
::::: time_t t0_0,t1_0,t2_0;
::::: time_t t0_f,t1_f,t2_f;
:::::
::::: t0_0 = time(NULL);
::::: int vSize = 10000000;
::::: int mSize = 10;
:::::
::::: vector<int> v(vSize);
:::::
::::: for (int i=0;i<vSize;i++){v.at(i) = i;}
:::::
::::: vector<vector<int> > m1(mSize);
::::: vector<vector<int> > m2;
::::: m2.reserve(mSize);
::::: t1_0 = time (NULL);
::::: for (int j=0;j<mSize;j++){m1.at(j) = v;}
:::::
::::: t1_f = time(NULL);
::::: t2_0 = time(NULL);
:::::
::::: for (int i=0; i<mSize;i++){ m2.push_back(v);}
:::::
::::: t2_f = time(NULL);
::::: t0_f = time(NULL);
::::: cout << "testTime0 = " << t0_f-t0_0 << endl;
::::: cout << "testTime1 = " << t1_f-t1_0 << endl;
::::: cout << "testTime2 = " << t2_f-t2_0 << endl;
:::::
::::: return 0;
::::: }
:::
::: Strange!
:::
::: I get about equal time for both versions. In release mode it in
::: fact runs so fast that I get 0-1 second for all results. Changing
::: time() to clock(), I get something like
:::
::: testTime0 = 890
::: testTime1 = 422
::: testTime2 = 406
:::
::: You don't run with iterator debugging enabled, or anything?
:::
::: Bo Persson
::
:: No. At least I don't think so. I'm still pretty new to the Visual
:: Studio IDE. When I ran the code shown here (in Visual Studio --
:: not a release .exe), I got
::
:: testTime0 = 43
:: testTime1 = 0
:: testTime2 = 38
::
:: The units are all seconds.
Ok, I have another guess: I have 2 GB of RAM and you have less?
If I change mSize to 25, I get the same result as you have -- that the
second test always runs slower!
Try running them in the opposite order, and you will probably get the
opposite result. Benchmarks are just so much fun!
Bo Persson