#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define COUNT1 262144 // 2^18
#define COUNT2 262145 // 2^18 + 1
#define COUNT3 262154 // 2^18 + 10
#define REPEATS 10000
void benchmark_copy(const int *src, int *dst, size_t count, const char *label) {
size_t size_bytes = count * sizeof(int);
for (int i = 0; i < REPEATS; ++i) {
}
double total_sec = (double)(end - start) / CLOCKS_PER_SEC;
printf("%s: Copied %zu bytes (%zu ints) %d times\n", label
, size_bytes
, count
, REPEATS
); printf("%s: Total time: %.6f sec\n", label
, total_sec
);
// Prevent optimizing away some stuff
}
int main(void) {
static int src1[COUNT1], dst1[COUNT1];
static int src2[COUNT2], dst2[COUNT2];
static int src3[COUNT3], dst3[COUNT3];
for (size_t i = 0; i < COUNT1; ++i) src1[i] = (int)i;
for (size_t i = 0; i < COUNT2; ++i) src2[i] = (int)i;
for (size_t i = 0; i < COUNT3; ++i) src3[i] = (int)i;
// Do all benchmarks twice just in case
benchmark_copy(src1, dst1, COUNT1, "COUNT1 (2^18)");
benchmark_copy(src1, dst1, COUNT1, "COUNT1 (2^18)");
benchmark_copy(src2, dst2, COUNT2, "COUNT2 (2^18 + 1)");
benchmark_copy(src2, dst2, COUNT2, "COUNT2 (2^18 + 1)");
benchmark_copy(src3, dst3, COUNT3, "COUNT3 (2^18 + 10)");
benchmark_copy(src3, dst3, COUNT3, "COUNT3 (2^18 + 10)");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgoKI2RlZmluZSBDT1VOVDEgMjYyMTQ0ICAgLy8gMl4xOAojZGVmaW5lIENPVU5UMiAyNjIxNDUgICAvLyAyXjE4ICsgMQojZGVmaW5lIENPVU5UMyAyNjIxNTQgICAvLyAyXjE4ICsgMTAKI2RlZmluZSBSRVBFQVRTIDEwMDAwCgp2b2lkIGJlbmNobWFya19jb3B5KGNvbnN0IGludCAqc3JjLCBpbnQgKmRzdCwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICpsYWJlbCkgewogICAgc2l6ZV90IHNpemVfYnl0ZXMgPSBjb3VudCAqIHNpemVvZihpbnQpOwoKICAgIGNsb2NrX3Qgc3RhcnQgPSBjbG9jaygpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVRTOyArK2kpIHsKICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNpemVfYnl0ZXMpOwogICAgfQogICAgY2xvY2tfdCBlbmQgPSBjbG9jaygpOwoKICAgIGRvdWJsZSB0b3RhbF9zZWMgPSAoZG91YmxlKShlbmQgLSBzdGFydCkgLyBDTE9DS1NfUEVSX1NFQzsKICAgIHByaW50ZigiJXM6IENvcGllZCAlenUgYnl0ZXMgKCV6dSBpbnRzKSAlZCB0aW1lc1xuIiwgbGFiZWwsIHNpemVfYnl0ZXMsIGNvdW50LCBSRVBFQVRTKTsKICAgIHByaW50ZigiJXM6IFRvdGFsIHRpbWU6ICUuNmYgc2VjXG4iLCBsYWJlbCwgdG90YWxfc2VjKTsKCiAgICAvLyBQcmV2ZW50IG9wdGltaXppbmcgYXdheSBzb21lIHN0dWZmCiAgICBwcmludGYoIiVkIFxuIiwgZHN0WzE0XSk7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIHN0YXRpYyBpbnQgc3JjMVtDT1VOVDFdLCBkc3QxW0NPVU5UMV07CiAgICBzdGF0aWMgaW50IHNyYzJbQ09VTlQyXSwgZHN0MltDT1VOVDJdOwogICAgc3RhdGljIGludCBzcmMzW0NPVU5UM10sIGRzdDNbQ09VTlQzXTsKCiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IENPVU5UMTsgKytpKSBzcmMxW2ldID0gKGludClpOwogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBDT1VOVDI7ICsraSkgc3JjMltpXSA9IChpbnQpaTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQ09VTlQzOyArK2kpIHNyYzNbaV0gPSAoaW50KWk7CiAgICAKICAgIC8vIERvIGFsbCBiZW5jaG1hcmtzIHR3aWNlIGp1c3QgaW4gY2FzZQogICAgYmVuY2htYXJrX2NvcHkoc3JjMSwgZHN0MSwgQ09VTlQxLCAiQ09VTlQxICgyXjE4KSIpOwogICAgYmVuY2htYXJrX2NvcHkoc3JjMSwgZHN0MSwgQ09VTlQxLCAiQ09VTlQxICgyXjE4KSIpOwogICAgYmVuY2htYXJrX2NvcHkoc3JjMiwgZHN0MiwgQ09VTlQyLCAiQ09VTlQyICgyXjE4ICsgMSkiKTsKICAgIGJlbmNobWFya19jb3B5KHNyYzIsIGRzdDIsIENPVU5UMiwgIkNPVU5UMiAoMl4xOCArIDEpIik7CiAgICBiZW5jaG1hcmtfY29weShzcmMzLCBkc3QzLCBDT1VOVDMsICJDT1VOVDMgKDJeMTggKyAxMCkiKTsKICAgIGJlbmNobWFya19jb3B5KHNyYzMsIGRzdDMsIENPVU5UMywgIkNPVU5UMyAoMl4xOCArIDEwKSIpOwoKICAgIHJldHVybiAwOwp9