[Assorted-commits] SF.net SVN: assorted:[1230] sandbox/trunk/src/cc/copy.cc
Brought to you by:
yangzhang
From: <yan...@us...> - 2009-02-24 20:03:20
|
Revision: 1230 http://assorted.svn.sourceforge.net/assorted/?rev=1230&view=rev Author: yangzhang Date: 2009-02-24 20:03:15 +0000 (Tue, 24 Feb 2009) Log Message: ----------- added trial at beating memcpy Added Paths: ----------- sandbox/trunk/src/cc/copy.cc Added: sandbox/trunk/src/cc/copy.cc =================================================================== --- sandbox/trunk/src/cc/copy.cc (rev 0) +++ sandbox/trunk/src/cc/copy.cc 2009-02-24 20:03:15 UTC (rev 1230) @@ -0,0 +1,100 @@ +// Just can't beat memcpy! +#include <cstring> +#include <algorithm> +#include <commons/time.h> +using namespace commons; +using namespace std; +enum { size = (int)200e6, reps = 5 }; +void mydumbmemcpy(char *q, char *p, size_t size) { + for (size_t i = 0; i < size; ++i) + q[i] = p[i]; +} +void mycopy(char *p, char *end, char *q) { + for (; p < end; ++p, ++q) + *q = *p; +} +void mymemcpy(char *q, char *p, size_t size) { + long long *qq = reinterpret_cast<long long*>(q), + *pp = reinterpret_cast<long long*>(p); + size /= sizeof(long long); + for (size_t i = 0; i < size; ++i) + qq[i] = pp[i]; +} +void unrolled(char *q, char *p, size_t size) { + long long *qq = reinterpret_cast<long long*>(q), + *pp = reinterpret_cast<long long*>(p), + *end = qq + size / sizeof(long long); + while (qq < end) { + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + *qq++ = *pp++; + } +} +//void mycopy(char *p, char *end, char *q) { +// for (; p < end; ++p, ++q) +// *q = *p; +//} +int main() { + char *p = new char[size], *q = new char[size]; + cout << "memcpy" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + memcpy(q, p, size); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + cout << "copy" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + copy(p, p + size, q); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + cout << "unrolled" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + unrolled(q, p, size); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + cout << "mydumbmemcpy" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + mydumbmemcpy(q, p, size); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + cout << "mycopy" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + mycopy(p, p + size, q); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + cout << "mymemcpy" << endl; + for (int i = 0; i < reps; ++i) { + long long start = current_time_millis(); + mymemcpy(q, p, size); + long long diff = current_time_millis() - start; + cout << diff << " ms or " << size / double(diff) / 1000 << " MB/s" << endl; + } + return 0; +} +#if 0 +482 ms or 414.938 MB/s +122 ms or 1639.34 MB/s +117 ms or 1709.4 MB/s +120 ms or 1666.67 MB/s +118 ms or 1694.92 MB/s +-- +165 ms or 1212.12 MB/s +162 ms or 1234.57 MB/s +152 ms or 1315.79 MB/s +153 ms or 1307.19 MB/s +153 ms or 1307.19 MB/s +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |