我们的软件在内存中构建一个大约80千兆字节的数据结构.然后,它可以直接使用此数据结构进行计算,或将其转储到磁盘,以便之后可以重复使用几次.在此数据结构中发生了大量随机内存访问.
对于更大的输入,这个数据结构可以变得更大(我们最大的一个超过300千兆字节),我们的服务器有足够的内存来容纳RAM中的所有内容.
如果将数据结构转储到磁盘,则会使用mmap将其加载回地址空间,强制进入os页面缓存,最后进行mlocked(最后的代码).
问题是在堆上立即使用计算数据结构(参见Malloc版本)或者对转储文件进行mmaping(参见mmap版本)之间的性能差异大约为16%.我没有一个很好的解释为什么会这样.有没有办法找出mmap为什么这么慢?我能以某种方式缩小这种性能差距吗?
我在运行带有3.10内核的Scientific Linux 7.2的服务器上进行了测量,它具有128GB RAM(足以适应所有内容),并且重复了几次,结果相似.有时差距会小一些,但不会太大.
我制作了一个最小的测试用例,可以看到效果.我尝试了不同的标志(MAP_SHARED等)但没有成功.mmap版本仍然较慢.
#include <random>
#include <iostream>
#include <sys/time.h>
#include <ctime>
#include <omp.h>
#include <sys/mman.h>
#include <unistd.h>
constexpr size_t ipow(int base, int exponent) {
size_t res = 1;
for (int i = 0; i < exponent; i++) {
res = res * base;
}
return res;
}
size_t getTime() {
struct timeval tv;
gettimeofday(&tv, NULL);
size_t ret = tv.tv_usec;
ret /= 1000;
ret += (tv.tv_sec * 1000);
return ret;
}
const size_t N …Run Code Online (Sandbox Code Playgroud) 我想在我的一个ExtJS4图表中有很多LineSeries.
我有一个看起来像这样的商店:
Ext.define('DayStatistics', {
extend:'Ext.data.ArrayStore',
fields:[ 'date', 'count_impressions', 'count_clicks', 'count_conversions' ]
});
Run Code Online (Sandbox Code Playgroud)
根据我在网格视图中选择的条目数量,我想为每个条目绘制三条线('count_impressions','count_clicks','count_conversions'),这意味着网格视图中的每个条目都会有一对商店里的条目.
目前,我有以下函数,每个selectionchange都调用它:
loadChart: function (Model, records) {
var removeChart = function (chart) {
var series = chart.series.items, surface = chart.surface,
length = series.length, len = surface.groups.keys.length,
array = [];
for (var i = 0; i < length; i++)
array = Ext.Array.merge(array, series[i].group.keys);
chart.series.clear();
for (var j = 0; j < array.length; j++)
surface.items.getByKey(array[j]).destroy();
for (var t = 0; t < len; t++)
surface.groups.items[t].destroy();
};
var chart = Ext.getCmp('advertiserstatisticlist.advertiserChart'); …Run Code Online (Sandbox Code Playgroud) c++ ×1
extjs ×1
extjs-mvc ×1
extjs4 ×1
javascript ×1
linux ×1
memory ×1
mmap ×1
performance ×1