Почему туалет является настолько медленным?

На основе моего опыта я действительно предложу НЕТ. В прошлые несколько лет, работая среды Linux на мои цели разработки, вещью, которая имеет значение больше всего, является производительность и устойчивость, и SD-карты едва предназначены для тех, я полагаю, что они служат внешней памятью больше (Исправьте меня, Если я неправ), а не основное высокоскоростное устройство хранения данных, такое как сам жесткий диск.

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

17
18.10.2013, 04:22
2 ответа

Просто предположение, но Вы - вид сравнения яблок к апельсинам относительно какой wc делает по сравнению с какой md5sum делает.

задача md5sum

Когда md5sum обрабатывает файл, он просто открывает файл как поток и затем начинает выполнять поток через функцию контрольной суммы MD5, для которой нужно очень мало памяти. Это по существу ЦП и диск ввод-вывод связывается.

задача туалета

Когда wc выполнения это делает намного более затем просто парсинг файла символ за один раз. Это должно на самом деле проанализировать структуру файла, строк во время, делая определения как, туда, где границы между символами и является ли это границей слова или нет.

Пример

Думайте о следующих строках и как каждый из алгоритмов должен был бы переместиться через них, поскольку они анализируют их:

“Hello! Greg”
“Hello!Greg”
“Hello\nGreg”
“A.D.D.”
“Wow, how great!”
“wow     \n\n\n    great”
“it was a man-eating shark.”

Для MD5 это тривиально перемещает через эти строки символ за один раз. Для wc это должно решить то, что является словом и границей строки, и отслеживайте количество случаев, которые это видит.

Дополнительные обсуждения туалета

Я нашел эту проблему кодирования с 2006, которая обсуждает реализацию wc в.NET. Трудности довольно очевидны, поскольку Вы смотрите на часть псевдо кода, таким образом, это могло бы помочь начать проливать свет на почему wc кажется, настолько медленнее, чем другие операции.

1
27.01.2020, 19:47
  • 1
    Вы описываете что-то другое, чем стандартная команда туалета Unix (по крайней мере, не тот, который идет с Ubuntu). Тот туалет не считает уникальные слова, просто слова, таким образом, "привет привет мир" является 3 словами, не 2. –  Johnny 18.10.2013, 06:18
  • 2
    На основе этой теории это кажется, что более простая задача, как подсчет строк, пошла бы более быстро. Изменяющиеся 'туалеты' для определения количества строки изменяют результаты существенно? 'туалет-l' –  Joshua Miller 18.10.2013, 06:50
  • 3
    @Johnny - я никогда не говорил, что он считает уникальные слова, Вы сказали это. wc количества несколько вещей, поскольку это анализирует файл. Это считает количество слов, строк и байтов, поскольку это анализирует файл. Прочитайте страницу справочника! –  slm♦ 18.10.2013, 07:04
  • 4
    @JoshuaMiller - Неясный, ли сообщение wc только считать строки ограничивает, это - внутренний парсинг так, чтобы это только считало эти вещи или просто только сообщило о результатах строк, даже при том, что это все еще считало все. –  slm♦ 18.10.2013, 07:05
  • 5
    @slm Вы действительно говорили это, считает уникальные слова, Ваш пример говорит “Привет! Greg” приводит к Привет 1, Greg 1, т.е. счета для каждого слова. И в проекте .NET, с которым Вы связались, говорится, что "Одна из его основных задач состоит в том, чтобы пройти ряд данных и считать количество повторений пообещанного. Например, учитывая предложение “Привет, да привет” это сказало бы Вам, что слово Привет использовалось дважды и что слово да использовалось однажды". В то время как в действительности результат эха "Привет, да привет" | туалет - слова, равняется "3", не "Привет: 2, Да: 1-дюймовый –  Johnny 18.10.2013, 07:19

Таким образом, я перешел к источнику, и похоже, что замедление находится в обработке двухбайтовых символов. По существу, для каждого символьного чтения в, это должно звонить mbrtowc() чтобы попытаться преобразовать его в широкий символ, затем тот широкий символ тестируется, чтобы видеть, является ли это разделитель слов, разделитель строки, и т.д.

Действительно, если я изменяю свою локаль LANG переменная от значения по умолчанию en_US.UTF-8 (UTF-8 является многобайтовым набором символов), и установите его на"C"(простой однобайтовый набор символов), wc может использовать однобайтовую оптимизацию, который значительно ускоряет его, беря только приблизительно четверть настолько же долго как прежде.

Кроме того, это только должно проверить каждый символ, если это делает слово (-w), длина строки (-L) или символ (-m) количества. Если это только делает байт и/или количества строки, это может пропустить обработку широкого символа, и затем это работает чрезвычайно быстро - быстрее, чем md5sum.

Я прокрутил его gprof, и функции, которые используются для обработки многобайтовых символов (mymbsinit(), mymbrtowc(), myiswprint(), и т.д.), поднимают приблизительно 30% одного только времени выполнения, и код, который ступает через буфер, намного более сложен, потому что он должен обработать измеренные шаги переменной через буфер для измеренных символов переменной, а также наполняющий любые частично завершенные символы, которые охватывают буфер назад к началу буфера, таким образом, он может быть обработан в следующий раз вокруг.

Теперь, когда я знаю, что искать, я нашел несколько сообщений, упомянув utf-8 замедление с некоторыми утилитами:

https://stackoverflow.com/questions/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up http://dtrace.org/blogs/brendan/2011/12/08/2000x-performance-win/

27
27.01.2020, 19:47
  • 1
    О, просто реализованный Вы - OP. :p –  Ivan Chau 18.10.2013, 10:35
  • 2
    Хотя это - большая часть ответа upvoted, это не важно. md5sum никогда не будет позволять Вам считать число слова и wc не вычислит md5 хеш файла! Это похоже на выяснение, почему мой автомобиль является настолько медленным по сравнению с моим печатающим устройством при записи текста. –  user49468 18.10.2013, 12:46
  • 3
    @user49468: разумно предположить, что оба - IO-bound, поскольку оба должны считать каждый байт входного файла. Этот ответ доказывает это wc на самом деле является зависящим от ЦП, при обработке многобайтовых символов. –  MSalters 18.10.2013, 14:26
  • 4
    @user49468: туалет и md5sum могут сделать, разные вещи, но оба читают файл и делают относительно простое вычисление, каждый вычисляет контрольную сумму, каждый считает байты, разделителей слов и новые строки. Ну, я думал, что это было просто, но не включило в дополнительную сложность многобайтовых наборов символов. Это похоже на больше выяснения, "Почему мой автомобиль в 20 раз быстрее при движении к хранилищу, чем мой минивэн?" Вы ожидали бы некоторое различие между этими двумя, но не 20X различие. –  Johnny 18.10.2013, 18:14
  • 5
    @Johnny Вы, сравнение автомобиля/минивэна испытывает недостаток в аспекте, что оба разработаны для переноса Вас к хранилищу. Таким образом, сравнение скорости существует. Сравнение Вашего автомобиля к механизму рисования дорожки более подходит. Просто, потому что оба используют улицы, их скорости не релевантны, поскольку живописец дорожки не подходит ходить по магазинам и наоборот. –  user49468 21.10.2013, 11:09

Теги

Похожие вопросы