Boost is a set of free software libraries that extend the functionality of C++, in the Wikipedia discription. There are tons of very useful features you'd expect to be native to an advanced programming language as C++ but are not.
How to get boost? Usually on Linux you can just say something like apt-get install libboost or yum install libboost. Let me know if you want a tutorial to compile or install boost. The examples below compile with both Intel and Gnu C++ compilers and even Nvidia compilers (I tried NVCC 4.0).
Here is a code example of how to time a routine with boost:
#include <boost/timer.hpp> // For boost::timer class
#include <iostream> // For printing
// Some constants
unsigned int x = 20000;
bool flag = true;
unsigned int k = 0;
int main() {
// Start boost timer.
boost::timer t;
// Do a double loop that takes some time.
for (unsigned int i = 0; i < x; i++) {
for (unsigned int j = 0; j < x; j++) {
k = i + j;
if (k % 2 == 0) {
flag = false;
} else {
flag = true;
}
}
}
// Store elapsed time from boost
double elapsed = t.elapsed();
// Print elapsed time from the t object.
std::cout << "boost/timer says:" << std::endl;
std::cout << "Total time = " << elapsed
<< " seconds" << std::endl;
std::cout << "Avg time/iter = " << elapsed / (x * x)
<< " seconds" << std::endl;
return 0;
}
I get the following output on my Core i5-760 box and the icpc compiler:
boost/timer says:
Total time = 0.35 seconds
Avg time/iter = 8.75e-10 seconds
You can use t.reset() if you want to reset the timer in your program.
If you want higher accuraccy, you can use the gettimeofday() function from sys/time.h. This example does not require boost either, but the code is way uglier. This is done very much like in the above code:
#include <sys/time.h> // For gettimeofday()
#include <iostream> // For printing
// Some constants
unsigned int x = 20000;
bool flag = true;
unsigned int k = 0;
int main() {
#include <iostream> // For printing
// Some constants
unsigned int x = 20000;
bool flag = true;
unsigned int k = 0;
int main() {
// Create objects for gettimeofday() timing
struct timeval start_time;
struct timeval end_time;
// Get the time of day -- NULL means we don't care about
// time zones. Store in start_time.
gettimeofday(&start_time, NULL);
// Do a double loop that takes some time.
for (unsigned int i = 0; i < x; i++) {
for (unsigned int j = 0; j < x; j++) {
k = i + j;
if (k % 2 == 0) {
flag = false;
} else {
flag = true;
}
}
}
//Store time of day in end time
gettimeofday(&end_time, NULL);
// Calculate the elapsed time with micro second accuracy from gettime of day
double start = start_time.tv_sec*1000000 + (start_time.tv_usec);
double end = end_time.tv_sec*1000000 + (end_time.tv_usec);
elapsed = end - start;
// Print elapsed time from gettimeofday().
std::cout << "gettimeofday says:" << std::endl;
std::cout << "Total time = " << elapsed
struct timeval start_time;
struct timeval end_time;
// Get the time of day -- NULL means we don't care about
// time zones. Store in start_time.
gettimeofday(&start_time, NULL);
// Do a double loop that takes some time.
for (unsigned int i = 0; i < x; i++) {
for (unsigned int j = 0; j < x; j++) {
k = i + j;
if (k % 2 == 0) {
flag = false;
} else {
flag = true;
}
}
}
//Store time of day in end time
gettimeofday(&end_time, NULL);
// Calculate the elapsed time with micro second accuracy from gettime of day
double start = start_time.tv_sec*1000000 + (start_time.tv_usec);
double end = end_time.tv_sec*1000000 + (end_time.tv_usec);
elapsed = end - start;
// Print elapsed time from gettimeofday().
std::cout << "gettimeofday says:" << std::endl;
std::cout << "Total time = " << elapsed
<< " microseconds" << std::endl;
std::cout << "Avg time/iter = " << elapsed / (x * x)
std::cout << "Avg time/iter = " << elapsed / (x * x)
<< " microseconds" << std::endl;
return 0;
}
return 0;
}
This gives me the following output:
gettimeofday says:
Total time = 366208 microseconds
Avg time/iter = 0.00091552 microseconds
Total time = 366208 microseconds
Avg time/iter = 0.00091552 microseconds
Happy coding! Let me know if you have questions or comments.
No comments:
Post a Comment