/
fill.cpp
63 lines (60 loc) · 2.16 KB
/
fill.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <chrono>
#include <cstring>
#include <iostream>
__attribute__((noinline)) char* bench(char *p, size_t n) {
std::chrono::time_point<std::chrono::steady_clock> start_clock =
std::chrono::steady_clock::now();
std::fill(p, p + n, 0);
asm volatile ("" : : : "memory");
std::chrono::time_point<std::chrono::steady_clock> end_clock =
std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed = end_clock - start_clock;
std::cout << "std::fill(p, p + n, 0) : "
<< (n / (1024. * 1024 * 1024.)) / elapsed.count() << " GB/s"
<< std::endl;
return p;
}
__attribute__((noinline)) char* bench1(char *p, size_t n) {
std::chrono::time_point<std::chrono::steady_clock> start_clock =
std::chrono::steady_clock::now();
std::fill(p, p + n, '\0');
asm volatile ("" : : : "memory");
std::chrono::time_point<std::chrono::steady_clock> end_clock =
std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed = end_clock - start_clock;
std::cout << "std::fill(p, p + n, '\\0') : "
<< (n / (1024. * 1024 * 1024.)) / elapsed.count() << " GB/s"
<< std::endl;
return p;
}
__attribute__((noinline)) char* bench2(char *p, size_t n) {
std::chrono::time_point<std::chrono::steady_clock> start_clock =
std::chrono::steady_clock::now();
memset(p,0,n);
asm volatile ("" : : : "memory");
std::chrono::time_point<std::chrono::steady_clock> end_clock =
std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed = end_clock - start_clock;
std::cout << "memset(p,0,n) : "
<< (n / (1024. * 1024 * 1024.)) / elapsed.count() << " GB/s"
<< std::endl;
return p;
}
int main() {
for (size_t i = 131072; i < 4294967296; i *= 2) {
std::cout << "page count: " << i / 4096
<< ", volume:" << (i / (1024. * 1024)) << " MB" << std::endl;
char * p = new char[i];
memset(p, 1, i);
for (int z = 0; z < 3; z++) {
bench(p, i);
bench1(p, i);
bench2(p, i);
std::cout << std::endl;
}
delete[] p;
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
}
}