我编写了一个简单的程序来研究在Linux(64位Red Hat Enterprise Linux Server 6.4版)上使用大量RAM时的性能。(请忽略内存泄漏。)
#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
double getWallTime()
{
struct timeval time;
if (gettimeofday(&time, NULL))
{
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
int main()
{
int *a;
int n = 1000000000;
do
{
time_t mytime = time(NULL);
char * time_str = ctime(&mytime);
time_str[strlen(time_str)-1] = '\0';
printf("Current Time : %s\n", time_str);
double start = getWallTime();
a = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = 1;
}
double elapsed = getWallTime()-start;
cout << elapsed << endl;
cout << "Allocated." << endl;
}
while (1);
return 0;
}
输出是
Current Time : Tue May 8 11:46:55 2018
3.73667
Allocated.
Current Time : Tue May 8 11:46:59 2018
64.5222
Allocated.
Current Time : Tue May 8 11:48:03 2018
110.419
顶部输出如下。我们可以看到尽管有足够的可用RAM,但是交换增加了。结果是运行时间从3秒猛增到64秒。
我的问题是
为什么Linux会牺牲性能而不是全部使用缓存的RAM?内存碎片?但是,将数据放在交换上也肯定会造成碎片。
是否有一种解决方法可以使3秒钟保持一致,直到达到物理RAM大小?