使用g ++避免C ++程序中的次要页面错误

时间:2011-10-30 05:53:51

标签: c++ g++ page-fault gild

我正在努力解决这个难题:Shipping Coding Puzzle。这是我到目前为止提出的代码:

#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include <set>
using namespace std;
struct Container
{
    Container(int c, int w) : cost(c), weight(w){}
    int cost;
    int weight;
    bool operator<(const Container& c) const
    {
        return double(cost)/weight < double(c.cost)/c.weight;
    }
};
int main(int argc, char** argv)
{
    int fd = open(argv[1], O_RDONLY);
    char* pContent = (char*)mmap(NULL, 128 * sizeof(int), PROT_READ, MAP_PRIVATE, fd, 0);
    pContent += 8;
    stringstream ss(pContent);
    int unload = 0;
    ss >> unload;
    set<Container> containers;
    int cost = 0, weight = 0;
    while(ss >> cost)
    {
        ss >> weight;
        containers.insert(Container(cost, weight));
    }

    const Container& best = *containers.begin();
    cost = best.cost * ceil(double(unload)/best.weight);
    printf("%d\n", cost);
    return 0;
}

我知道这个逻辑可能存在一些错误。但我的问题与逻辑无关。当我提交此代码时,它成功运行,但我得到的分数较少,因为它表示次要页面错误数为409。当我看到排行榜时,有人提交了一个带有轻微页面错误的C ++代码69。有什么办法可以控制这些小页错误吗?可能正在使用一些g ++标志?现在我的make文件非常简单:g++ -o MyExe MyExe.cc

1 个答案:

答案 0 :(得分:2)

你可以使用Gild用来判断它们的任何算法和运行时环境。我认为编译器标志可能是一个红色的鲱鱼;我怀疑在“发布模式”下提交会为你打开-O2或-O3。

我怀疑这是一个优化内存使用的问题,可能是内存局部性。例如,字符串流和集合可能会变得非常昂贵;在你的鞋子里,我开始寻找是否有另一种方式,也许是采用更加量身定制的算法。