Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

C++

Name: Snake4D 2012-04-11 17:38

A simple question...

is it better to traverse a std::vector like this:

std::vector<int> myvec;
//populate the vector
for(int i = 0; i < myvec.size(); ++i){
    myvec[i] += 1;
}


or is better like this?

std::vector<int> myvec;
typedef std::vector<int>::iterator IT_int;
for(IT_int it = myvec.begin(); it != myvec.end(); ++it){
     *it += 1;
}

Name: Anonymous 2012-04-11 17:52

#include <iostream>
#include <vector>
#include <ctime>

int main (int argc, char * const argv[]) {
    std::vector<int> myvec;
    for (int i = 0; i < 100000000; ++i) {
        myvec.push_back(i);
    }
    typedef std::vector<int>::iterator IT_int;
   
    clock_t start,end;
   
    start = std::clock();
    for (IT_int it = myvec.begin(); it != myvec.end(); ++it) {
        *it += 1;
    }
    end = std::clock();
   
    std::cout << end - start << std::endl;
   
    start = std::clock();
    for (int i = 0; i < myvec.size(); ++i) {
        myvec[i] += 1;
    }
    end = std::clock();
   
    std::cout << end - start << std::endl;
   
    return 0;
}


output:

1st try:
2858863
1135227

2nd try:
2461235
1139648

3rd try:
2618116
1133062


compiled with XCode 3.2.5, GCC 4.2

Name: Anonymous 2012-04-11 18:05

Just use an array.

Name: Anonymous 2012-04-11 18:11

>>1
Strictly speaking you should use iterators. It has the advantage of just being a pointer, but that said, I think C++ ideologies like these are just plain silly.

Name: Anonymous 2012-04-11 18:14

#include <iostream>
#include <vector>
#include <ctime>

#define SIZETOTEST 100000

int main (int argc, char * const argv[]) {
   
    std::vector<int> myvec;
    int myarray[SIZETOTEST];
   
    for (int i = 0; i < SIZETOTEST; ++i) {
        myvec.push_back(i);
        myarray[i] = i;
    }
    typedef std::vector<int>::iterator IT_int;
   
    clock_t start,end;
   
    start = std::clock();
    for (IT_int it = myvec.begin(); it != myvec.end(); ++it) {
        *it += 1;
    }
    end = std::clock();
   
    std::cout << "iterator it:   " << end - start << std::endl;
   
    start = std::clock();
    for (int i = 0; i < myvec.size(); ++i) {
        myvec[i] += 1;
    }
    end = std::clock();
   
    std::cout << "int i:         "<< end - start << std::endl;
   
    start = std::clock();
    for (int i = 0; i < SIZETOTEST; ++i) {
        myarray[i] = myarray[i] + 1;
    }
    end = std::clock();
    std::cout << "c-style array: " << end - start << std::endl;
   
    return 0;
}


a little deeper analysis:
in debug mode (no or really few optimization):

iterator it:   2430
int i:         1141
c-style array: 561


in release mode:

iterator it:   108
int i:         160
c-style array: 2


amazing... the iterator get faster than the normal access... (the c_style array optimization is also crazy...)

Name: Anonymous 2012-04-11 20:11

>>5
With the vector, you're potentially doing 100,000 reallocs and bounds checks, but with the array, you're just storing at an offset to a register.

Name: Anonymous 2012-04-12 0:16

>>6
push_back has order one amortized time according to the best resource to seeples on the internat http://www.cplusplus.com but I agree that it should be avoided in favor of performing a single call to resize and then modification by the [] operator.

>>5
one way to implement a vector iterator would be a direct pointer to a place in the vector's array. And then the tests, it == vec.end() can be performed by comparing the value of the pointer to the address just after the end of the used part of the array. If you were to use indexing on a C array, the compiler can handle optimizing away the index if necessary.

http://en.wikipedia.org/wiki/Loop-invariant_code_motion

Name: Anonymous 2012-04-12 0:29


std::vector<int> myvec;
for(std::vector<int>::iterator it = myvec.begin(); it != myvec.end(); ++it){
     *it += 1;
}


Frivolous typedef considered UNREADABLE

Name: Anonymous 2012-04-12 0:34

>>5
the iterator get faster than the normal access

Because the optimizer can treat it as a pointer in some cases.

If you don't need vector functionality, then it's stupid to use them instead of C arrays.

Name: Anonymous 2012-04-12 1:06

>>9
That's really sad. There's no reason for vector iteration to be so much more inefficient than c array iteration. Although, to be fair, >>5 should do a test with a non statically allocated array. And >>5 should check the assembly output to see if the compiler is just culling out the c array iteration code, because the compiler might know that the code doesn't do anything meaningful or used later, whereas with the vector it might not be able to figure that out.

Name: Anonymous 2012-04-12 3:18

should be

for(std::vector<int>::iterator i = myvec.begin(), e = myvec.end(); i < e; i++) {


but it doesn't matter for the other one. This will probably make a difference even in release mode since myvec.end() isn't guaranteed to be invariant between calls (mutation by other threads, &c)

Name: Anonymous 2012-04-12 3:20

>>11
er, obviously i != e there instead

Name: Anonymous 2012-04-12 5:11

>>2-12 ARE YOU FAGGOTS EH?
>>1

    BOOST_FOREACH(int & it, myvec)
    {
        it += 1;
    }

Name: Anonymous 2012-04-12 5:16

C++11 is the best.


for(int& item : myvec) {
    item += 1;
}


Other way could be to use std::for_each with lambda, but I generally prefer range based for-loop.

Name: Anonymous 2012-04-12 5:36

>>14
Haskell is the best


map (+ 1) myvec

Other way could be to use pattern matching, but I generally prefer built-in functions.

Name: Anonymous 2012-04-12 5:38

c++ is such an abomination

Name: VIPPER 2012-04-12 5:50

C++ makes all other abominations look good in comparsion.

Its just screaming please kill me.

Name: JEW 2012-04-12 6:32

>>17 is just screaming please give me some toilets to scrub!

Name: Anonymous 2012-04-12 6:46

>>15
Too bad it has GC. Haskell is not the best. GC is shit.

Name: Anonymous 2012-04-12 7:24

would someone bugger me?

Name: Anonymous 2012-04-12 8:25

Wow. I'm surprised that there is really difference in speed between these versions. I thought optimizers in -O3 already could optimize out differences. Alas.

Well, anyway I prefer iterator approach as in debug mode it checks ranges.

Name: Anonymous 2012-04-12 8:45

Well, anyway I prefer index approach as in /prog/ mode it checks dubs.

Name: Anonymous 2012-04-12 12:58

What kind of shitty compilers are you using to get results like that?

With gcc traversing a vector with an iterator or an unsigned int as well as traversing an array are all equally fast. Iterating with signed int is about 20% slower which I guess is because gcc doesn't change the < comparison to != then, and equality comparisons are often a bit faster.

Name: Anonymous 2012-04-12 13:42

>>23
equality comparisons are often a bit faster.
Stop it, I'm crying.

Name: Anonymous 2012-04-12 13:43

>>23
laughing_whores.fif
lrn2cpu

Name: Anonymous 2012-04-12 14:42

Comparing (x < y) is O(n) because it checks (x == 0 || x == 1 || ... || x == y-1)

Name: Anonymous 2012-04-12 14:53

>>26
It's actually a O(n) SUB operation (x-y) and then followed by a check to see if the sign bit is 1

Name: Anonymous 2012-04-12 14:56

>>14
oh lawdy it's like C++ is taking a turn for java syntax sugar

Name: Anonymous 2012-04-12 15:07

>>26
Yeah, and comparing (x!=y) is O(n) because it checks (x_0!=y_0 || x_1!=y_1 || ... || x_{n-1)!=y_{n-1}).  Also you're a shit troll and a faggot.

Name: Anonymous 2012-04-12 15:38

>>26,27,29
It's actually O(1) since it only does 2*INT_MAX+1 comparisons and INT_MAX is a compile time constant.

Now fuck off shitty trolls.

Name: Anonymous 2012-04-12 16:28

>>27
>subtraction
>O(n) operation
How's that 1960s CPU doing for ya?

Name: Anonymous 2012-04-12 16:31

>>31
sadfrog.png

Name: kodak_gallery_programmer !!kCq+A64Losi56ze 2012-04-12 17:14

And the special olympics of computer science continues...

Name: Anonymous 2012-04-12 17:57

>>33
Life without a job must leave you with more time to troll and shitpost kodak-san

Name: kodak_gallery_programmer !!kCq+A64Losi56ze 2012-04-12 20:25

>>34
I'm gonna pursue my Ph.D in computational fluid dynamics at UCLA this fall.

Name: Anonymous 2012-04-12 20:26

Ph.D in computational fluid dynamics
What? Why is this a subject of Ph.D study?

Name: Anonymous 2012-04-12 22:44

>>36 PHDs are like that, all specific and shit.

Name: Anonymous 2012-04-12 22:49

>>29
that can actually be O(log(n)) where n is the number of bits, by using a balanced tree of or gates. And the same applies to x == y operation, except you would use and gates.

Name: Anonymous 2012-04-12 22:54

>>35
I'm gonna pursue my BA in toilet scrubbing at anywhere that will hire me forever.

Name: >>38 2012-04-12 23:38

err rather nands and nors or whatever is appropriate.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List