Мой входной файл составляет 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 работает плохо?
C++ std::map
- упорядоченная структура данных, обычно реализуемая как дерево. Более справедливое сравнение было бы между java.util.HashMap
и std::unordered_map
или java.util.TreeMap
и std::map
.
while(!EOF){...}
stackoverflow.com/questions/8736862/…