#include <string.h>
#include <iostream>
#include <chrono>
#include <iostream>
#include <iomanip>
using namespace std::chrono;
// based on
// http://w...content-available-to-author-only...t.org/doc/libs/1_54_0/libs/chrono/example/await_keystroke.cpp
template<class Clock>
class Timer
{
typename Clock::time_point start;
public:
Timer()
: start(Clock::now()) {
}
typename Clock::duration elapsed() const {
return (Clock::now() - start);
}
double seconds() const {
return (elapsed().count() *
((double)Clock::period::num / Clock::period::den));
}
};
#define BUFFERSIZE (100 * 1024 * 1024) // 100 mb
#define LOOPS 10
#define MAXSTRIDE 128
int main()
{
char *b1 = (char *)::malloc(BUFFERSIZE + MAXSTRIDE);
char *b2 = (char *)::malloc(BUFFERSIZE + MAXSTRIDE);
::memset(b1, 0, BUFFERSIZE + MAXSTRIDE);
// Each test is performed |LOOP| times; the average run-time is then printed.
// Test memcpy() by copying from buffer b1 to b2
{Timer<high_resolution_clock> t;
for (int i = 0; i < LOOPS; i++)
memcpy(b2, b1, BUFFERSIZE);
double seconds = t.seconds();
std::cout << "memcpy " << (seconds / LOOPS) << std::endl;
}
// Test memcpy() by copying from buffer b1 to b2
Timer<high_resolution_clock> t;
for (int i = 0; i < LOOPS; i++)
memcpy(b2, b1, BUFFERSIZE);
double seconds = t.seconds();
std::cout << "memcpy " << (seconds / LOOPS) << std::endl;
// Test memmove() by inserting a small gap at the beginning of the buffer
for (int stride = 2; stride <= MAXSTRIDE; stride *= 2) {
Timer<high_resolution_clock> t;
for (int i = 0; i < LOOPS; i++)
memmove(b2, b1, BUFFERSIZE);
double seconds = t.seconds();
std::cout << "memmove (" << std::setfill('0') << std::setw(3)
<< stride << ") " << (seconds / LOOPS) << std::endl;
}
::free(b1);
::free(b2);
}
I2luY2x1ZGUgPHN0cmluZy5oPgogCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CiAKLy8gYmFzZWQgb24KLy8gaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQub3JnL2RvYy9saWJzLzFfNTRfMC9saWJzL2Nocm9uby9leGFtcGxlL2F3YWl0X2tleXN0cm9rZS5jcHAKdGVtcGxhdGU8Y2xhc3MgQ2xvY2s+CmNsYXNzIFRpbWVyCnsKdHlwZW5hbWUgQ2xvY2s6OnRpbWVfcG9pbnQgc3RhcnQ7CiAKcHVibGljOgpUaW1lcigpCjogc3RhcnQoQ2xvY2s6Om5vdygpKSB7Cn0KIAp0eXBlbmFtZSBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCgpIGNvbnN0IHsKcmV0dXJuIChDbG9jazo6bm93KCkgLSBzdGFydCk7Cn0KIApkb3VibGUgc2Vjb25kcygpIGNvbnN0IHsKcmV0dXJuIChlbGFwc2VkKCkuY291bnQoKSAqCigoZG91YmxlKUNsb2NrOjpwZXJpb2Q6Om51bSAvIENsb2NrOjpwZXJpb2Q6OmRlbikpOwp9Cn07CiAKI2RlZmluZSBCVUZGRVJTSVpFICgxMDAgKiAxMDI0ICogMTAyNCkgLy8gMTAwIG1iCiNkZWZpbmUgTE9PUFMgMTAKI2RlZmluZSBNQVhTVFJJREUgMTI4CiAKaW50IG1haW4oKQp7CmNoYXIgKmIxID0gKGNoYXIgKik6Om1hbGxvYyhCVUZGRVJTSVpFICsgTUFYU1RSSURFKTsKY2hhciAqYjIgPSAoY2hhciAqKTo6bWFsbG9jKEJVRkZFUlNJWkUgKyBNQVhTVFJJREUpOwo6Om1lbXNldChiMSwgMCwgQlVGRkVSU0laRSArIE1BWFNUUklERSk7CiAKLy8gRWFjaCB0ZXN0IGlzIHBlcmZvcm1lZCB8TE9PUHwgdGltZXM7IHRoZSBhdmVyYWdlIHJ1bi10aW1lIGlzIHRoZW4gcHJpbnRlZC4KIAogLy8gVGVzdCBtZW1jcHkoKSBieSBjb3B5aW5nIGZyb20gYnVmZmVyIGIxIHRvIGIyCntUaW1lcjxoaWdoX3Jlc29sdXRpb25fY2xvY2s+IHQ7CmZvciAoaW50IGkgPSAwOyBpIDwgTE9PUFM7IGkrKykKbWVtY3B5KGIyLCBiMSwgQlVGRkVSU0laRSk7CmRvdWJsZSBzZWNvbmRzID0gdC5zZWNvbmRzKCk7CnN0ZDo6Y291dCA8PCAibWVtY3B5ICIgPDwgKHNlY29uZHMgLyBMT09QUykgPDwgc3RkOjplbmRsOwp9Ci8vIFRlc3QgbWVtY3B5KCkgYnkgY29weWluZyBmcm9tIGJ1ZmZlciBiMSB0byBiMgpUaW1lcjxoaWdoX3Jlc29sdXRpb25fY2xvY2s+IHQ7CmZvciAoaW50IGkgPSAwOyBpIDwgTE9PUFM7IGkrKykKbWVtY3B5KGIyLCBiMSwgQlVGRkVSU0laRSk7CmRvdWJsZSBzZWNvbmRzID0gdC5zZWNvbmRzKCk7CnN0ZDo6Y291dCA8PCAibWVtY3B5ICIgPDwgKHNlY29uZHMgLyBMT09QUykgPDwgc3RkOjplbmRsOwoKLy8gVGVzdCBtZW1tb3ZlKCkgYnkgaW5zZXJ0aW5nIGEgc21hbGwgZ2FwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgpmb3IgKGludCBzdHJpZGUgPSAyOyBzdHJpZGUgPD0gTUFYU1RSSURFOyBzdHJpZGUgKj0gMikgewpUaW1lcjxoaWdoX3Jlc29sdXRpb25fY2xvY2s+IHQ7CmZvciAoaW50IGkgPSAwOyBpIDwgTE9PUFM7IGkrKykKbWVtbW92ZShiMiwgYjEsIEJVRkZFUlNJWkUpOwpkb3VibGUgc2Vjb25kcyA9IHQuc2Vjb25kcygpOwpzdGQ6OmNvdXQgPDwgIm1lbW1vdmUgKCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDMpCjw8IHN0cmlkZSA8PCAiKSAiIDw8IChzZWNvbmRzIC8gTE9PUFMpIDw8IHN0ZDo6ZW5kbDsKfQogCjo6ZnJlZShiMSk7Cjo6ZnJlZShiMik7Cn0g