#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <vector>
class stopwatch
{
clock_t last_;
public:
stopwatch()
{
reset();
}
void reset()
{
last_ = std::clock();
}
double time()
{
return (std::clock() - last_) / static_cast<double>(CLOCKS_PER_SEC);
}
};
void my_copy(void* dst, const void* src, std::size_t size)
{
std::size_t pack_size = size / sizeof(long long);
std::size_t leftover_size = size - pack_size * sizeof(long long);
while (pack_size--)
*(long long*)dst = *(long long*)src;
while (leftover_size--)
*(char*)dst = *(char*)src;
}
int main()
{
std::vector<char> source(52428800), destination(52428800);
std::generate(source.begin(), source.end(), rand);
{
stopwatch w;
for (int i = 10; i--; )
std::copy(source.begin(), source.end(), destination.begin());
std::cout << "copy time: " << w.time() << '\n';
}
{
stopwatch w;
for (int i = 10; i--; )
std::memcpy(destination.data(), source.data(), source.size());
std::cout << "memcpy time: " << w.time() << '\n';
}
{
stopwatch w;
for (int i = 10; i--; )
my_copy(destination.data(), source.data(), source.size());
std::cout << "my_copy time: " << w.time() << '\n';
}
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIHN0b3B3YXRjaAp7CgljbG9ja190IGxhc3RfOwpwdWJsaWM6CglzdG9wd2F0Y2goKQoJewoJCXJlc2V0KCk7Cgl9Cgl2b2lkIHJlc2V0KCkKCXsKCQlsYXN0XyA9IHN0ZDo6Y2xvY2soKTsKCX0KCWRvdWJsZSB0aW1lKCkKCXsKCQlyZXR1cm4gKHN0ZDo6Y2xvY2soKSAtIGxhc3RfKSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oQ0xPQ0tTX1BFUl9TRUMpOwoJfQp9OwoKdm9pZCBteV9jb3B5KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzdGQ6OnNpemVfdCBzaXplKQp7CiAgc3RkOjpzaXplX3QgcGFja19zaXplID0gc2l6ZSAvIHNpemVvZihsb25nIGxvbmcpOwogIHN0ZDo6c2l6ZV90IGxlZnRvdmVyX3NpemUgPSBzaXplIC0gcGFja19zaXplICogc2l6ZW9mKGxvbmcgbG9uZyk7CgogIHdoaWxlIChwYWNrX3NpemUtLSkKCQkqKGxvbmcgbG9uZyopZHN0ID0gKihsb25nIGxvbmcqKXNyYzsKCiAgd2hpbGUgKGxlZnRvdmVyX3NpemUtLSkKCQkqKGNoYXIqKWRzdCA9ICooY2hhciopc3JjOwp9CgppbnQgbWFpbigpCnsKCXN0ZDo6dmVjdG9yPGNoYXI+IHNvdXJjZSg1MjQyODgwMCksIGRlc3RpbmF0aW9uKDUyNDI4ODAwKTsKCXN0ZDo6Z2VuZXJhdGUoc291cmNlLmJlZ2luKCksIHNvdXJjZS5lbmQoKSwgcmFuZCk7CgkKCXsKCQlzdG9wd2F0Y2ggdzsKCQlmb3IgKGludCBpID0gMTA7IGktLTsgKQoJCQlzdGQ6OmNvcHkoc291cmNlLmJlZ2luKCksIHNvdXJjZS5lbmQoKSwgZGVzdGluYXRpb24uYmVnaW4oKSk7CgkJc3RkOjpjb3V0IDw8ICJjb3B5IHRpbWU6ICIgPDwgdy50aW1lKCkgPDwgJ1xuJzsKCX0KCgl7CgkJc3RvcHdhdGNoIHc7CgkJZm9yIChpbnQgaSA9IDEwOyBpLS07ICkKCQkJc3RkOjptZW1jcHkoZGVzdGluYXRpb24uZGF0YSgpLCBzb3VyY2UuZGF0YSgpLCBzb3VyY2Uuc2l6ZSgpKTsKCQlzdGQ6OmNvdXQgPDwgIm1lbWNweSB0aW1lOiAiIDw8IHcudGltZSgpIDw8ICdcbic7Cgl9CgoJewoJCXN0b3B3YXRjaCB3OwoJCWZvciAoaW50IGkgPSAxMDsgaS0tOyApCgkJCW15X2NvcHkoZGVzdGluYXRpb24uZGF0YSgpLCBzb3VyY2UuZGF0YSgpLCBzb3VyY2Uuc2l6ZSgpKTsKCQlzdGQ6OmNvdXQgPDwgIm15X2NvcHkgdGltZTogIiA8PCB3LnRpbWUoKSA8PCAnXG4nOwoJfQp9