Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czym spowodowana jest różnica czasu wykonania?

Ostatnio zmodyfikowano 2017-04-22 14:50
Autor Wiadomość
Saran
Temat założony przez niniejszego użytkownika
Czym spowodowana jest różnica czasu wykonania?
» 2017-04-18 00:02:16
Mamy sobie taki kodzik:
C/C++
#include <iostream>
#include <vector>
#include <GLFW/glfw3.h>

#define ITERATIONS 1000
#define ELEMENTS 500000

class Foo
{
public:
    std::vector < bool > funs;
};

int main()
{
    glfwInit();
    double time = glfwGetTime();
   
    Foo foo;
    foo.funs.resize( ELEMENTS );
   
    for( int it = 0; it < ITERATIONS; it++ ) {
        for( int i = 0; i < ELEMENTS; i++ )
        {
            foo.funs[ i ] = 1;
        }
    }
   
    double time2 = glfwGetTime();
    std::cout << "Elapsed time: " <<( time2 - time ) * 1000 << std::endl;
    return 0;
}

Czas wykonania to około 11.5 sekund.

Teraz mamy taki:
C/C++
#include <iostream>
#include <vector>
#include <GLFW/glfw3.h>

#define ITERATIONS 1000
#define ELEMENTS 500000

class bool_class
{
public:
    bool fun;
};

class Foo
{
public:
    std::vector < bool_class > funs;
};

int main()
{
    glfwInit();
    double time = glfwGetTime();
   
    Foo foo;
    foo.funs.resize( ELEMENTS );
   
    for( int it = 0; it < ITERATIONS; it++ ) {
        for( int i = 0; i < ELEMENTS; i++ )
        {
            foo.funs[ i ].fun = 1;
        }
    }
   
    double time2 = glfwGetTime();
    std::cout << "Elapsed time:" <<( time2 - time ) * 1000 << std::endl;
    return 0;
}

Czas wykonania to około 1.3 sekundy.

Czym jest spowodowana taka różnica?
Opisałby ktoś krok po kroku, jak komputer wykonuje powyższe kody?
Z początku myślałem, iż pierwszy kod będzie szybszy z powodu braku jeszcze jednego "poziomu" klas.
P-160234
michal11
» 2017-04-18 09:31:10
Pomijając to, że takie sprawdzanie nie ma większego sensu, to
std::vector < bool >
 nie jest zwykłym vectorem który przechowuje zmienne typu bool. http://en.cppreference.com/w​/cpp/container/vector_bool
P-160238
Saran
Temat założony przez niniejszego użytkownika
» 2017-04-18 11:05:47
Aha, zapomniałem o tym, że upakowywuje 8 bool w jednym bajcie, ta?
P-160240
michal11
» 2017-04-18 12:14:13
Tak, trzyma wartości jako pojedyncze bity.
P-160241
Saran
Temat założony przez niniejszego użytkownika
» 2017-04-21 10:19:34
Mamy taki kod:
C/C++
#include <iostream>
#include <vector>
#include <GLFW/glfw3.h>

#define ITERATIONS 100
#define ELEMENTS 500000

class Fun
{
public:
    bool fun;
    Fun()
        : fun( 0 )
    { } // CONSTRUCTOR
};

class Foo
{
public:
    std::vector < Fun > funs;
};

int main()
{
    glfwInit();
    double time = glfwGetTime();
   
    Foo foo;
   
    for( int it = 0; it < ITERATIONS; it++ ) {
        for( int i = 0; i < ELEMENTS; i++ )
        {
            Fun bar;
            //bar.fun = 0; // ASSIGNMENT
           
            foo.funs.push_back( bar );
        }
    }
   
    double time2 = glfwGetTime();
    std::cout << "Elapsed time: " <<( time2 - time ) * 1000 << " milliseconds." << std::endl;
    return 0;
}
Czas jego wykonania to około 1760ms. Jeśli natomiast odkomentujemy ASSIGNMENT, oraz zakomentujemy konstruktor, około 630ms, czyli raczej dobrze.


Teraz mamy taki kodzik:
C/C++
#include <iostream>
#include <vector>
#include <GLFW/glfw3.h>

#define ITERATIONS 100
#define ELEMENTS 500000

class Fun
{
public:
    bool fun;
    //Fun() : fun(0){} // CONSTRUCTOR
};

class Foo
{
public:
    std::vector < Fun > funs;
};

int main()
{
    glfwInit();
    double time = glfwGetTime();
   
    Foo foo;
    foo.funs.resize( ELEMENTS );
   
    for( int it = 0; it < ITERATIONS; it++ ) {
        for( int i = 0; i < ELEMENTS; i++ )
        {
            Fun bar;
            bar.fun = 0; // ASSIGNMENT
           
            foo.funs[ i ].fun = bar.fun;
        }
    }
   
    double time2 = glfwGetTime();
    std::cout << "Elapsed time: " <<( time2 - time ) * 1000 << " milliseconds." << std::endl;
    return 0;
}
Jeśli znów pobawimy się w komentowanie i odkomentowywanie, zauważymy, że tym razem czasy wykonania są praktycznie takie same(ok. 170ms), czasem konstruktor wydaje się być szybszy. Czyżbym sprawdzał coś źle, jak zasugerował @michal11, czy co?
P-160321
pekfos
» 2017-04-22 00:19:00
Czyżbym sprawdzał coś źle, jak zasugerował @michal11, czy co?
A co ty sprawdzasz?
P-160342
Saran
Temat założony przez niniejszego użytkownika
» 2017-04-22 00:51:11
Różnicę czasu wykonania właśnie. Oraz to, czemu jest tak, a nie inaczej.
P-160343
pekfos
» 2017-04-22 01:04:18
A w jakich warunkach to sprawdzasz? Wygenerowany kod sprawdzałeś?
P-160344
« 1 » 2
  Strona 1 z 2 Następna strona