Почему C ++ STL map является классом медленной карты Java?

0

Мой входной файл составляет 2 ГБ, и в этом файле каждая строка представляет собой слово. Мне нужно написать программу для выполнения 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: 32 с, C++ стоимость: 38 с. Этот пробел я могу принять. Моя среда - Unbuntu Linux 13.04, а C++ - оптимизация -O2. Почему STL работает плохо?

  • 0
    Это может вам помочь, ваша реализация на С ++ плохая, она не работает, while(!EOF){...} stackoverflow.com/questions/8736862/…
  • 4
    Обратите внимание, что вы снова сравниваете грибы и яблоки. Java делает здесь много разных вещей. Например, строки java неизменны и являются просто ссылками, в C ++ они копируются в дерево.
Показать ещё 1 комментарий
Теги:
stl

1 ответ

8
Лучший ответ

C++ std::map - упорядоченная структура данных, обычно реализуемая как дерево. Более справедливое сравнение было бы между java.util.HashMap и std::unordered_map или java.util.TreeMap и std::map.

  • 0
    Да, я использую unordered_map, теперь C ++ работает быстрее, чем Java. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню