![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
Почему std::string_view МЕДЛЕННЕЕ, чем std::string?04.06.2016, 20:57. Показов 8790. Ответов 28
Метки нет Все метки)
(
Всем привет!
Нужно найти количество уникальных строк в больших текстовых файлах (размером до нескольких гигабайт). Почему в нижеследующем коде результат выполнения со string_view , который не копирует элементы, значительно медленнее, чем в случае сo string ?!
0
|
04.06.2016, 20:57 | |
Ответы с готовыми решениями:
28
ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ |
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
04.06.2016, 21:12 [ТС] | |
Может быть я не туда копаю, в чем тогда бутылочное горлышко? Может мапить файл нужно по частям, а не сразу весь?
И вдогонку: 1. Безопасно ли в таком коде парсить текст через поиск '\n' используя memchr ? Насколько я знаю, системный вызов mmap работает с сырым содержимым файла и не преобразовывает переводы строки в нативный формат (хотя QFile выше я открываю в текстовом режиме).2. Можно ли как-нибудь без геморроя распараллелить такую задачу? (Предпочтительно std и Qt способы, но упоминайте все, что знаете ![]()
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
04.06.2016, 21:53 | ||||
2) Станет только хуже, так как map это красивая обертка вокруг чтения данных с диска. А диск (если не SSD), вообще говоря, произвольный доступ поддерживает хреново и от скачки по файлу вперед-назад (один поток читает начало, другой середину) начнет тормозить.
0
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||
04.06.2016, 22:01 [ТС] | ||||
std::string по такому же принципу хеш считается.\r\n и \n будут трактоваться по-разному, если mmap открывает файл в бинарном режиме. (Если конечно qt-обертка не добавляет такое преобразование, ведь QFile я открывал в режиме QFile::Text)
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
04.06.2016, 22:07 | |||
1
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||
04.06.2016, 22:30 [ТС] | ||
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
04.06.2016, 22:55 | ||
Если для std::unordered_set, то dst.insert(src.begin(),src.end()). После этого написать комитету по стандартизации очередное воззвание "впилите splice как в std::list!". Правда, пишут им который год (как минимум про splice в std::map), а воз и ныне там. Если для своей реализации, то хранить элементы вместе с их хешами, чтобы не пересчитывать при переносе в другую таблицу. Сам перенос элемента (при отсутствии коллизий) и так за константное время делается. Чего там еще оптимизировать?
1
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||
05.06.2016, 02:11 [ТС] | ||
avgoor, вы спрашивали
0
|
![]() 1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
05.06.2016, 02:30 | ||
UPD: поправка: уникальных - лишнее.
Добавлено через 15 минут
0
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||
05.06.2016, 02:44 [ТС] | ||
std::getline или std::basic_istream::operator>> сделают всю работу. С использованием mmap производительность выросла на 12%.Единственным способом дальнейшего повышения производительности вижу распараллеливание считывания из файла при наличии SSD и параллельной обработки нескольких хеш-таблиц с последующим их слиянием.
0
|
![]() 1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||||||
05.06.2016, 02:58 | |||||||
1
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||||||||||||
05.06.2016, 04:17 [ТС] | ||||||||||||||||
avgoor, а такой вариант я, как ни странно, еще не пробовал. Думаю сишный ввод/вывод уделает с++. Попробую днем, а то уже ничего не соображаю
![]() avgoor, в общем не смог я уснуть не попробовав ![]() Такой код:
std::string , получается чуть медленнее, чем mmap — 37 сек:
string_view ... сюрприз — 52сек:
0
|
![]() 1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|||
05.06.2016, 13:22 | |||
gromo, Тогда осталась только одна мысль: Т.к. вы писали, что у вас пол миллиарда строк на два гига - строки в среднем полусаются по 4 байта и срабатывает short string optimization, которая за счет локальности данных заруливает string_view.
А вообще ковырять надо. Сбросьте сюда генератор тестовых данных - поковыряюсь. Добавлено через 5 минут
0
|
![]() 383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
05.06.2016, 17:11 [ТС] | ||||||
avgoor, вообще важна именно итоговая производительность операции по обнаружению кол-ва уникальных строк в файле, — а что будет лежать в основе этого, какие-нибудь хитрые операции ввода вывода в сочетании с хранением в string или в string_view — дело десятое. Хотя я действительно чуть перепутал предмет дискуссии выше, прошу прощения.
Генератор самый простой:
0
|
![]() 1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
05.06.2016, 23:41 | |
gromo, Сегодня уже лень, завтра поковыряю. Пока вам статья в тему: https://habrahabr.ru/post/246257/
Обратите внимание на пункт 8 в ыводной таблице (точнее на разницу во времени).
0
|
05.06.2016, 23:41 | |
Помогаю со студенческими работами здесь
20
Реализация класса MyString. Стандартная библиотека, std::string, std::vector Передача функции указатель на элемент std::vector<std::string> Операция std::cout для Объекта типа std::string
Как правильно перевести std::wstring в std::string ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
|
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
|
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
|
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
|
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
|
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C#
Задание 1:
КЛАСС FORM 1
public partial class Form1 : Form
{
Spisok listin = new Spisok();
. . .
|
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
|
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
|
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
|
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
|