Intereting Posts
Расширяемый прослушиватель кликов Android ExpandableListView предотвращает расширение Добавить onclick-прослушиватель в предопределенную кнопку? Неподдерживаемый тип носителя – статус HTTP 415 Шифровать данные в Android с помощью файла public.pem RSA, сгенерированного в Ruby Андроид Custom Listview Фокусное состояние не работает Как получить уведомление, когда устройство подключается к вашему Wi-Fi-модему Wi-Fi Wi-Fi? Android, я пытаюсь найти, какой тип номера (от контакта) (мобильный, домашний, рабочий) Как получить представление больше, чем его родитель? Студия Android – Не удалось выполнить выполнение градиента – ошибка при открытии zip-файла Как получить доступ к оставшемуся времени батареи в андроиде Как определить, является ли активность последней активностью в стеке Настройка темы ActionBarSherlock для Android-приложения Небезопасная реализация интерфейса X509TrustManager – Службы Google Play Просмотр файлов excel в приложении для Android Как отключить «автопрокрутку» час на заданное значение минуты в выборе времени андроида

C ++ ifstream.getline () значительно медленнее, чем Java BufferedReader.readLine ()?

Я переписываю одно из своих приложений для Android, чтобы воспользоваться преимуществами NDK, и одна из первых вещей, которые он должен делать каждый раз, – открыть текстовый файл размером 1,5 МБ (приблизительно 150 тыс. Строк) и поместить каждую строку в данные состав. Когда я делал эту операцию с использованием BufferedReader.readLine () Java, чтение файла с SD-карты занимает ~ 2,5 секунды. Вот код, который я использовал для этого:

try { BufferedReader br = new BufferedReader(new FileReader("/sdcard/testfile.txt")); String thisLine; while ((thisLine = br.readLine()) != null) { Log.d(TAG, thisLine); } } catch (IOException e) { //Log error } 

Использование C ++ с ifstream заставляет MUCH дольше … около 3 минут для того же файла. Вот код, который я использовал в C ++:

 char buffer[256]; ifstream ifs; ifs.open("/sdcard/testfile.txt", ifstream::in); if (ifs.is_open()) { while (!ifs.eof()) { ifs.getline (buffer,100); LOGD(buffer); } } 

Я довольно ржавый на C ++, но не могу придумать логического объяснения увеличения времени чтения. Некоторое время я думал, что это может быть функция LOGD, но я попытался полностью вытащить это, и время чтения не помогло. Кто-нибудь есть идеи о том, что может быть проблема? Есть ли более быстрый способ читать файл по строкам в C ++? Благодарю.

Одна мысль – синхронизация stdio может замедлить вас. Это можно отключить. Я не знаю, будет ли это объяснять все различия, но вы можете попробовать. Кроме того, вы не используете eof() правильно. Наконец, я бы использовал std :: string версию getline()

 std::ios::sync_with_stdio(false); ifstream ifs("/sdcard/testfile.txt"); std::string line; while (getline(ifs, line)) { LOGD(line); } 

Я не тестировал этот код, но вы можете попробовать его и посмотреть, не изменилось ли это.

Возможно ли, что поток не загружен, и он делает SD-доступ для каждого байта данных? Чтобы обеспечить буфер, сделайте следующее (размер по вашему усмотрению).

 ifstream ifs; char stream_buffer[4096]; ifs.rdbuf()->pubsetbuf(stream_buffer, sizeof(stream_buffer) ); ifs.open(argv[1]); 

C ++ не создает для вас потоки (редактировать: они не будут по умолчанию , см. Решение Dave Smith). Я скажу вам, что ваш код будет медленным на обычном диске на диске. У меня нет большого опыта работы с Android, fwiw.

Обычно я использую что-то вроде этого:

 struct buffered_reader { buffered_reader(std::istream &data_) : data(data_), done(false) {} bool next(std::string &line) { if (!lines.size()) { if (done) return false; std::string line; for (size_t i = 0; i < 500; i++) { std::getline(data, line); if (data.eof()) { done = true; break; } lines.push_back(line); } } line = lines.front(); lines.pop_front(); return true; } std::istream &data; bool done; std::deque<std::string> lines; }; TEST(blah) { std::stringstream ss; ss << "a" << std::endl; ss << "a" << std::endl; ss << "a" << std::endl; ss << "a" << std::endl; buffered_reader reader(ss); std::string line; while(reader.next(line)) { std::cout << line << std::endl; } } 

Это не в производстве нигде, поэтому никаких гарантий за пределами тестирования вы видите здесь;)