Skip to content

Instantly share code, notes, and snippets.

@cfr
Created June 3, 2015 07:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cfr/f219791d8ff791033cb0 to your computer and use it in GitHub Desktop.
Save cfr/f219791d8ff791033cb0 to your computer and use it in GitHub Desktop.
// clang -std=c99 -O3 cpy-vs-cat.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mach/mach_time.h>
const int e6 = 1000000;
#define repeat for(int j = 0; j < e6; j++)
void flush() { fflush(stdout); }
int main() {
double pcat = 1.0/0;
for(size_t sz = 0; sz < 1 << 20; sz += sz, sz += 1024*!sz) {
printf("10⁶×%9zu b", sz), flush();
char* to = calloc(2*sz+1, sizeof(char));
char* from = calloc(sz+1, sizeof(char));
memset(to, 1, sz);
memset(from, 1, sz);
printf(" ⇒ "), flush();
uint64_t t = mach_absolute_time(); // nsec
repeat { strcat(to, from); to[sz] = 0; }
double dcat = (mach_absolute_time() - t) / e6; // msec
printf("%9.1f (×%.0f) : ", dcat, dcat/pcat), flush();
t = mach_absolute_time();
repeat { memcpy(to + sz, from, sz+1); }
double dcpy = (double)((mach_absolute_time() - t)) / e6;
printf("%9.1f, cat = %.3f cpy)\n", dcpy, dcat/dcpy);
free(from), free(to);
pcat = dcat;
}
}
/* rmpb14
10⁶× 0 b ⇒ 18.0 (×0) : 3.9, cat = 4.613 cpy)
10⁶× 1024 b ⇒ 114.0 (×6) : 16.3, cat = 6.984 cpy)
10⁶× 2048 b ⇒ 190.0 (×2) : 34.0, cat = 5.588 cpy)
10⁶× 4096 b ⇒ 342.0 (×2) : 52.2, cat = 6.552 cpy)
10⁶× 8192 b ⇒ 630.0 (×2) : 117.6, cat = 5.355 cpy)
10⁶× 16384 b ⇒ 1694.0 (×3) : 193.5, cat = 8.754 cpy)
10⁶× 32768 b ⇒ 3644.0 (×2) : 1351.9, cat = 2.695 cpy)
10⁶× 65536 b ⇒ 7561.0 (×2) : 2690.4, cat = 2.810 cpy)
10⁶× 131072 b ⇒ 16877.0 (×2) : 5391.1, cat = 3.131 cpy)
10⁶× 262144 b ⇒ 36838.0 (×2) : 13533.8, cat = 2.722 cpy)
10⁶× 524288 b ⇒ 77799.0 (×2) : 29948.5, cat = 2.598 cpy)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment