小编Bru*_*tos的帖子

随机mmaped内存访问比堆数据访问慢16%

我们的软件在内存中构建一个大约80千兆字节的数据结构.然后,它可以直接使用此数据结构进行计算,或将其转储到磁盘,以便之后可以重复使用几次.在此数据结构中发生了大量随机内存访问.

对于更大的输入,这个数据结构可以变得更大(我们最大的一个超过300千兆字节),我们的服务器有足够的内存来容纳RAM中的所有内容.

如果将数据结构转储到磁盘,则会使用mmap将其加载回地址空间,强制进入os页面缓存,最后进行mlocked(最后的代码).

问题是在堆上立即使用计算数据结构(参见Malloc版本)或者对转储文件进行mmaping(参见mmap版本)之间的性能差异大约为16%.我没有一个很好的解释为什么会这样.有没有办法找出mmap为什么这么慢?我能以某种方式缩小这种性能差距吗?

我在运行带有3.10内核的Scientific Linux 7.2的服务器上进行了测量,它具有128GB RAM(足以适应所有内容),并且重复了几次,结果相似.有时差距会小一些,但不会太大.

新更新(2017/05/23):

我制作了一个最小的测试用例,可以看到效果.我尝试了不同的标志(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)

c++ linux memory performance mmap

15
推荐指数
1
解决办法
792
查看次数

将多个系列加载到图表中

我想在我的一个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)

javascript extjs extjs4 extjs-mvc

5
推荐指数
1
解决办法
3400
查看次数

标签 统计

c++ ×1

extjs ×1

extjs-mvc ×1

extjs4 ×1

javascript ×1

linux ×1

memory ×1

mmap ×1

performance ×1