Ngolunye usuku, ngahlangana nekhodi ethile umsebenzisi ayeyisebenzisa ukuqapha ukusebenza kwe-RAM emshinini wabo obonakalayo. Ngeke ngabelane ngekhodi (kuyinto exakile) futhi ngizokwabelana kuphela ngezinto ezibalulekile. Ngakho, ikati lisestudiyo!
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
buffers[i] = new char[SIZE];
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}Kulula: nikeza inkumbulo bese ubhala igigabhayithi eyodwa kuyo. Ngakho-ke lokhu kuhlola kubonisani?
$ ./memtest
I-4.06504 GB / s
Cishe i-4GB/s.
Ini?!?!
Kanjani?!?!?
Lena i-Core i7 (ngisho noma kungeyona entsha), i-DDR4, iphrosesa cishe ayilayishwanga - KUNGANI?!?!
Impendulo, njengenjwayelo, ijwayelekile ngokungavamile.
U-opharetha omusha (njengomsebenzi we-malloc, ngendlela) empeleni akabeki inkumbulo. Uma kubizwa, isinikezeli sibheka uhlu lwamabhulokhi enkumbulo yamahhala echibini, futhi uma engekho, ibiza sbrk() ukukhulisa ingxenye yedatha, bese ibuyisela ireferensi ekhelini lebhulokhi esanda kwabiwa.
Inkinga ukuthi indawo eyabelwe i-virtual ngokuphelele. Awekho amakhasi enkumbulo angempela anikeziwe.
Futhi uma ukufinyelela kokuqala kwekhasi ngalinye kusuka kule ngxenye eyabelwe kwenzeka, i-MMU "ishisa" iphutha lekhasi, ngemva kwalokho ikhasi elibonakalayo elifinyelelwayo labelwa elangempela.
Ngakho-ke, empeleni, asihloli ukusebenza kwamamojula webhasi ne-RAM, kodwa ukusebenza kwe-MMU ne-VMM yesistimu yokusebenza. Ukuhlola ukusebenza kwangempela kwe-RAM, sidinga nje ukuqalisa izindawo ezabiwe kanye. Ngokwesibonelo, kanje:
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
// FIXED HERE!!!
buffers[i] = new char[SIZE](); // Add brackets, &$# !!!
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}Okusho ukuthi, simane siqalise amabhafa abiwe ngenani elizenzakalelayo (char 0).
Sihlola:
$ ./memtest
I-28.5714 GB / s
Ngolunye udaba lolo.
Ukuziphatha kwendaba ukuthi uma udinga amabhafa amakhulu ukuze ugijime ngokushesha, ungakhohlwa ukuwaqalisa.
Source: www.habr.com
