Wax yar oo dheeraad ah oo ku saabsan baaritaanka xun

Maalin maalmaha ka mid ah waxaan si lama filaan ah ula kulmay koodka in isticmaaluhu uu isku dayayo inuu la socdo waxqabadka RAM ee mishiinkiisa farsamada. Ma siin doono koodhkan (waxaa jira "maro cago") oo waxaan ka tagi doonaa oo kaliya waxa ugu muhiimsan. Markaa, bisadu waxay ku jirtaa istuudiyaha!

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

Way fududahay - qoondee xusuusta oo ku qor hal gigabyte. Muxuuse tijaabadani muujinayaa?

$ ./memtest
4.06504 GB / s

Ku dhawaad ​​4GB/s.

Waa maxay?!?!

sidee?!?!?

Kani waa Core i7 (inkasta oo uusan ahayn kan ugu cusub), DDR4, processor-ku kuma dhowa lama rarin - MAXAY ?!?!

Jawaabta, sida had iyo jeer, waa mid aan caadi ahayn oo caadi ah.

Hawlwadeenka cusub (sida shaqada malloc, habka) dhab ahaantii ma qoondeeyo xusuusta. Wicitaan, qoondeeyuhu wuxuu eegayaa liiska goobaha bilaashka ah ee barkadda xusuusta, haddii aysan jirinna, wac sbrk () si loo kordhiyo qaybta xogta, ka dibna ku soo celi barnaamijka iyada oo tixraacaysa cinwaanka goobta cusub. loo qoondeeyey.

Dhibaatadu waxay tahay in aagga loo qoondeeyay uu yahay mid gebi ahaanba muuqaal ah. Ma jiraan bogag xusuusta dhabta ah oo la qoondeeyey.

Oo marka gelitaanka ugu horreeya ee bog kasta oo ka mid ah qaybtan loo qoondeeyey ay dhacdo, MMU waxay "toogataa" khalad bog, ka dib bogga casriga ah ee la gelayo waxaa loo qoondeeyaa mid dhab ah.

Sidaa darteed, dhab ahaantii, ma tijaabineyno waxqabadka baska iyo modules RAM, laakiin waxqabadka MMU iyo VMM ee nidaamka hawlgalka. Si loo tijaabiyo waxqabadka dhabta ah ee RAM, waxaan u baahanahay kaliya inaan bilowno meelaha loo qoondeeyay hal mar. Tusaale ahaan sidan:

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

Taasi waa, waxaan si fudud ku bilownay kaydiyeyaasha loo qoondeeyay qiimaha caadiga ah (char 0).

Hubinta:

$ ./memtest
28.5714 GB / s

Shay kale.

Akhlaaqda sheekada - haddii aad u baahan tahay bakhaarro waaweyn si aad dhaqso ugu shaqeyso, ha ilaawin inaad bilawdo.

Source: www.habr.com

Add a comment