He iti ake mo te whakamatautau kino

I tetahi ra i tupono noa ahau ki tetahi waehere e ngana ana tetahi kaiwhakamahi ki te aro turuki i nga mahi RAM i roto i tana miihini mariko. E kore ahau e hoatu tenei waehere (he "waewae" kei reira) ka waiho e au nga mea tino nui. Na, ko te ngeru kei roto i te taiwhanga!

#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;
}

He mea ngawari - toha te mahara ka tuhia kia kotahi kipaita ki roto. A he aha ta tenei whakamatautau e whakaatu ana?

$ ./memtest
4.06504 GB / s

Tata ki te 4GB/s.

He aha?!?!

Pehea?!?!?

Ko Core i7 tenei (ahakoa ehara i te mea hou), DDR4, kua tata kore utaina te tukatuka - HE AHA?!?!

Ko te whakautu, pera i nga wa katoa, he rereke noa.

Ko te kaiwhakahaere hou (penei i te mahi malloc, na te ara) kaore e tino tohatoha mahara. Ma tenei piiraa, ka tirohia e te kaitoha te rarangi o nga waahi kore utu i roto i te puna mahara, a ki te kore he mea, ka waea sbrk() ki te whakanui ake i te waahanga raraunga, katahi ka hoki mai ki te kaupapa he tohutoro ki te wahitau mai i te waahi hou noa. tohaina.

Ko te raruraru ko te waahi kua tohaina he mariko katoa. Karekau he wharangi mahara tuturu ka tohatohahia.

A, ka puta te urunga tuatahi ki ia wharangi mai i tenei waahanga kua tohatohahia, ka "kopere" te MMU i tetahi he wharangi, ka mutu ko te wharangi mariko e uru ana ka tohua he mea pono.

Na reira, ko te tikanga, kaore matou e whakamatautau ana i nga mahi o te pahi me nga waahanga RAM, engari ko te mahi a te MMU me te VMM o te punaha whakahaere. A, hei whakamatautau i te tino mahi o te RAM, me arawhiti noa nga waahi kua tohaina. Hei tauira penei:

#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;
}

Arā, ka arawhiti noa tatou i nga kaitarai kua tohaina me te uara taunoa (char 0).

Ka tirohia e matou:

$ ./memtest
28.5714 GB / s

Ko tetahi atu mea.

Momo o te korero - ki te hiahia koe kia tere te mahi i nga parapara nui, kaua e wareware ki te arawhiti.

Source: will.com

Tāpiri i te kōrero