为什么C ++ STL映射是缓慢的Java'地图课?

时间:2014-04-09 09:08:03

标签: java c++ stl

我的输入文件是2GB,在这个文件中每行都是一个单词。我需要写一个程序来做wordcount。我使用Java和C ++来完成相同的任务,但结果令人惊讶:C ++太慢了!我的代码如下:

C ++:

int main() {

    struct timespec ts, te;
    double cost;
    clock_gettime(CLOCK_REALTIME, &ts);

    map<string, int> map;    
    ifstream fin("inputfile.txt");
    string word;
    while(getline(fin, word)) {
        ++map[word];
    }

    clock_gettime(CLOCK_REALTIME, &te);    
    cost = te.tv_sec - ts.tv_sec + (double)(te.tv_nsec-ts.tv_nsec)/NANO;
    printf("cost: %-15.10f s\n", cost);

    return 0;
}

输出:     费用:257.62秒

爪哇:

public static void main(String[] args) throws Exception {

    long startTime = System.currentTimeMillis();
    Map<String, Integer> map = new HashMap<String, Integer>();
    FileReader reader = new FileReader("inputfile.txt");
    BufferedReader br = new BufferedReader(reader);

    String str = null;
    while((str = br.readLine()) != null) {
        Integer count = map.get(str);
        map.put(str, count == null ? 1 : count + 1);
    }

    long endTime = System.currentTimeMillis();
    System.out.println("cost : " + (endTime - startTime)/1000 + "s");
}

输出:     费用:124秒

我删除了while内部的代码,只是读取文件但没有做任何事情,结果是一样的。 Java成本:32s,C ++成本:38s。这个差距我可以接受。 我的环境是Ubuntu Linux 13.04和C ++使用-O2 optimation。 为什么STL表现不佳?

1 个答案:

答案 0 :(得分:8)

C ++ std::map是一种有序的数据结构,通常以树形式实现。更公平的比较可以是java.util.HashMapstd::unordered_mapjava.util.TreeMapstd::map