Intereting Posts
Android networkinfo всегда возвращает true, даже если интернет недоступен Сделать фон для изменения кнопки Android при щелчке по XML Сканирование нескольких штрих-кодов с помощью ZXing Исключение Android TextView и null указателя Можно ли проверить, видно или отменено уведомление? Как отслеживать кнопку со стрелкой вниз на виртуальной клавиатуре? Могут ли API-приложения Android или API-интерфейсы действий работать на более высоких уровнях API? Проблемы с GLUtils.texImage2D и Alpha в текстурах Android TextView defStyle игнорируется? Список предпочтений показывает только первый элемент Дважды нажмите кнопку Android back back, чтобы выйти из приложения. BackupAgent.onRestore не вызывается при повторной установке приложения. BUT вызывается для команды восстановления bmgr. 17.8 Распределение кучи MiB для простого проекта Hello World? NPE в ChangeCurrentByOneFromLongPressCommand (на устройствах Samsung с Android 4.3) 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; } } 

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