Last active
August 29, 2015 14:18
-
-
Save Climax777/a2703eed304444c49e21 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
#include <algorithm> | |
#include <iostream> | |
#include <ctime> | |
#include <functional> | |
#define LOG(x) { std::cout << #x << " = " << (x) << "\n"; } | |
#define TIME(t) { std::cout << ((double)(clock() - (t)) / CLOCKS_PER_SEC) << " s\n"; } | |
volatile unsigned long long out = 0; | |
volatile unsigned long long out1 = 0; | |
volatile unsigned long long out2 = 0; | |
volatile unsigned long long out3 = 0; | |
void accumulate(unsigned long long number) | |
{ | |
for (unsigned long long i = 0; i < number; ++i) | |
out += number; | |
} | |
void accumulate2(unsigned long long number) | |
{ | |
for (unsigned long long i = 0; i < number; ++i) | |
out1 += number; | |
} | |
unsigned long long i1; | |
unsigned long long i2; | |
auto lamb1 = [=](unsigned long long number) { | |
for (i1 = 0; i1 < number; ++i1) | |
out2 += number; | |
}; | |
auto lamb2 = [=](unsigned long long number) { | |
for ( i2 = 0; i2 < number; ++i2) | |
out3 += number; | |
}; | |
typedef void (*sumptr)(unsigned long long); | |
template<typename Function> | |
inline void execute(unsigned long long size, Function func) { | |
func(size); | |
} | |
int main(int argc, char** argv) | |
{ | |
const size_t MAX = 100; // number of tests | |
const unsigned long long SIZE = strtoull(argv[1], NULL, 10); // length of the vector | |
clock_t clk; | |
std::cout << "iterator\n"; | |
sumptr functptr; | |
std::function<void(unsigned long long)> func; | |
std::function<void(unsigned long long)> bindfunc; | |
if(argc > 2) { | |
functptr = accumulate; | |
func = lamb1; | |
bindfunc = std::bind(&accumulate, std::placeholders::_1); | |
} else { | |
functptr = accumulate2; | |
func = lamb2; | |
bindfunc = std::bind(&accumulate2, std::placeholders::_1); | |
} | |
clk = clock(); | |
for (size_t i = 0; i < MAX; ++i) | |
functptr(SIZE); | |
TIME(clk) | |
std::cout << "\nlambda\n"; | |
clk = clock(); | |
for (size_t i = 0; i < MAX; ++i) | |
func(SIZE); | |
/*if(argc > 2) { | |
for (size_t i = 0; i < MAX; ++i) | |
execute(SIZE, lamb1); | |
} else { | |
for (size_t i = 0; i < MAX; ++i) | |
execute(SIZE, lamb2); | |
}*/ | |
TIME(clk) | |
std::cout<< out << std::endl; | |
std::cout<< out1 << std::endl; | |
std::cout<< out2 << std::endl; | |
std::cout<< out3 << std::endl; | |
std::cout << "\nbind\n"; | |
out = 0; | |
out1 = 0; | |
clk = clock(); | |
for (size_t i = 0; i < MAX; ++i) | |
bindfunc(SIZE); | |
TIME(clk) | |
std::cout<< out << std::endl; | |
std::cout<< out1 << std::endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment