// Example program
#include <iostream>
#include <string>
#include <cstdlib> //for random
#include <cmath> //for pow
#include <chrono>
int main()
{
size_t seed=rand(); //The testbench will be different everytime, but the testbench will be the same for both paths.
static const size_t NUM_ITERS=3000000;
std::chrono::time_point<std::chrono::system_clock> start1, end1,start2,end2;
uint32_t finhash;
//Pow
srand(seed);
finhash=0;
start1 = std::chrono::system_clock::now();
for(size_t i=0;i<NUM_ITERS;i++)
{
uint32_t n=rand() & 0x1F;
finhash^=(uint32_t)pow(2,n);
}
end1 = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds1 = end1-start1;
std::cout << "Pow elapsed time: " << elapsed_seconds1.count() << "s. Hash was " << finhash << std::endl;
//leftshift
srand(seed);
finhash=0;
start2 = std::chrono::system_clock::now();
for(size_t i=0;i<NUM_ITERS;i++)
{
uint32_t n=rand() & 0x1F;
finhash^=(uint32_t)(1 << n);
}
end2 = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds2 = end2-start2;
std::cout << "LeftShift elapsed time: " << elapsed_seconds2.count() << "s. Hash was " << finhash << std::endl;
return 0;
}
Ly8gRXhhbXBsZSBwcm9ncmFtCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+IC8vZm9yIHJhbmRvbQojaW5jbHVkZSA8Y21hdGg+ICAvL2ZvciBwb3cKI2luY2x1ZGUgPGNocm9ubz4KCmludCBtYWluKCkKewogICAgc2l6ZV90IHNlZWQ9cmFuZCgpOyAvL1RoZSB0ZXN0YmVuY2ggd2lsbCBiZSBkaWZmZXJlbnQgZXZlcnl0aW1lLCBidXQgdGhlIHRlc3RiZW5jaCB3aWxsIGJlIHRoZSBzYW1lIGZvciBib3RoIHBhdGhzLgogICAgc3RhdGljIGNvbnN0IHNpemVfdCBOVU1fSVRFUlM9MzAwMDAwMDsKICAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN0YXJ0MSwgZW5kMSxzdGFydDIsZW5kMjsKICAgIHVpbnQzMl90IGZpbmhhc2g7CiAgICAKICAgIC8vUG93CiAgICBzcmFuZChzZWVkKTsKICAgIGZpbmhhc2g9MDsKICAgIHN0YXJ0MSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAgZm9yKHNpemVfdCBpPTA7aTxOVU1fSVRFUlM7aSsrKQogICAgewogICAgICAgIHVpbnQzMl90IG49cmFuZCgpICYgMHgxRjsKICAgICAgICBmaW5oYXNoXj0odWludDMyX3QpcG93KDIsbik7ICAgCiAgICB9CiAgICBlbmQxID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMxID0gZW5kMS1zdGFydDE7CiAgICBzdGQ6OmNvdXQgPDwgIlBvdyBlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzMS5jb3VudCgpIDw8ICJzLiAgSGFzaCB3YXMgIiA8PCBmaW5oYXNoIDw8IHN0ZDo6ZW5kbDsKCiAgICAvL2xlZnRzaGlmdAogICAgc3JhbmQoc2VlZCk7CiAgICBmaW5oYXNoPTA7CiAgICBzdGFydDIgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgIGZvcihzaXplX3QgaT0wO2k8TlVNX0lURVJTO2krKykKICAgIHsKICAgICAgICB1aW50MzJfdCBuPXJhbmQoKSAmIDB4MUY7CiAgICAgICAgZmluaGFzaF49KHVpbnQzMl90KSgxIDw8IG4pOyAgIAogICAgfQogICAgZW5kMiA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzMiA9IGVuZDItc3RhcnQyOwogICAgc3RkOjpjb3V0IDw8ICJMZWZ0U2hpZnQgZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kczIuY291bnQoKSA8PCAicy4gIEhhc2ggd2FzICIgPDwgZmluaGFzaCA8PCBzdGQ6OmVuZGw7CgogICAgcmV0dXJuIDA7Cn0=