Czym spowodowana jest różnica czasu wykonania?
Ostatnio zmodyfikowano 2017-04-22 14:50
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: #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: #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. |
|
michal11 |
» 2017-04-18 09:31:10 |
|
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? |
|
michal11 |
» 2017-04-18 12:14:13 Tak, trzyma wartości jako pojedyncze bity. |
|
Saran Temat założony przez niniejszego użytkownika |
» 2017-04-21 10:19:34 Mamy taki kod: #include <iostream> #include <vector> #include <GLFW/glfw3.h>
#define ITERATIONS 100 #define ELEMENTS 500000
class Fun { public: bool fun; Fun() : fun( 0 ) { } };
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; 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: #include <iostream> #include <vector> #include <GLFW/glfw3.h>
#define ITERATIONS 100 #define ELEMENTS 500000
class Fun { public: bool fun; };
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; 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? |
|
pekfos |
» 2017-04-22 00:19:00 Czyżbym sprawdzał coś źle, jak zasugerował @michal11, czy co? |
A co ty sprawdzasz? |
|
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. |
|
pekfos |
» 2017-04-22 01:04:18 A w jakich warunkach to sprawdzasz? Wygenerowany kod sprawdzałeś? |
|
« 1 » 2 |