为什么C++ STL映射是慢速java的map类?

为什么C++ STL映射是慢速java的map类?,java,c++,stl,Java,C++,Stl,我的输入文件是2GB,在这个文件中,每一行都是一个字。我需要写一个程序来计算字数。我用java和C++做同样的任务,结果却令人吃惊:C++太慢了!我的代码如下: C++: 输出: 费用:257.62秒 爪哇: 输出: 费用:124美元 我删除里面的代码的同时,只是读取文件,但不做任何事情,结果是一样的。java成本:32秒,C++成本:38秒。这个差距我可以接受。 我的环境是Ubuntu Linux 13.04和C++使用-O2优化。 为什么STL的性能很差? < P> C++是一种有序的数据结

我的输入文件是2GB,在这个文件中,每一行都是一个字。我需要写一个程序来计算字数。我用java和C++做同样的任务,结果却令人吃惊:C++太慢了!我的代码如下:

C++:

输出: 费用:257.62秒

爪哇:

输出: 费用:124美元

我删除里面的代码的同时,只是读取文件,但不做任何事情,结果是一样的。java成本:32秒,C++成本:38秒。这个差距我可以接受。 我的环境是Ubuntu Linux 13.04和C++使用-O2优化。
为什么STL的性能很差?

< P> C++是一种有序的数据结构,通常作为树来实现。一个更公平的比较是在和之间或./p>这可能对你有帮助,你的C++实现是坏的,它是一个模式的破坏!EOF{…}注意,您再次比较了蘑菇和苹果。Java在这里做了许多完全不同的事情。例如,java字符串是不可变的,只是引用,在C++中它们被复制到树中。虽然BJ Orn已经提到了一些重要的东西,但是还有很多其他可能的因素。例如,如果你刚刚用C++读取了磁盘上的文件,内容可能仍然在java的内存缓存中,FileReader和/或BufferedReader可能使用后台线程、更大的缓冲区、内存映射或其他更高效的I/O机制来减少对操作系统的读取调用数量。所有这些技术都是C++中可能的,你只需要选择性能、简单性、便携性等的混合。是的,我使用无序的地图,现在C++运行得比java快。非常感谢。
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;
}
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");
}