На основе моего опыта я действительно предложу НЕТ. В прошлые несколько лет, работая среды Linux на мои цели разработки, вещью, которая имеет значение больше всего, является производительность и устойчивость, и SD-карты едва предназначены для тех, я полагаю, что они служат внешней памятью больше (Исправьте меня, Если я неправ), а не основное высокоскоростное устройство хранения данных, такое как сам жесткий диск.
Одна из наиболее грандиозной задачи, с которой Вы, вероятно, столкнетесь во время этой кампании, когда Вы теряете свою SD-карту или повреждаете ее так или иначе. Хотя, это может быть зафиксировано, это много путает задачу для начинающих. Ожидание справки от онлайн-сообщества, такого как этот сайт сам не могло бы гарантировать решение, и можно застрять с бесполезной системой в течение многих дней.
Просто предположение, но Вы - вид сравнения яблок к апельсинам относительно какой wc
делает по сравнению с какой 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
кажется, настолько медленнее, чем другие операции.
Таким образом, я перешел к источнику, и похоже, что замедление находится в обработке двухбайтовых символов. По существу, для каждого символьного чтения в, это должно звонить 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/
md5sum
никогда не будет позволять Вам считать число слова и wc
не вычислит md5 хеш файла! Это похоже на выяснение, почему мой автомобиль является настолько медленным по сравнению с моим печатающим устройством при записи текста.
– user49468
18.10.2013, 12:46
wc
на самом деле является зависящим от ЦП, при обработке многобайтовых символов.
– MSalters
18.10.2013, 14:26
wc
количества несколько вещей, поскольку это анализирует файл. Это считает количество слов, строк и байтов, поскольку это анализирует файл. Прочитайте страницу справочника! – slm♦ 18.10.2013, 07:04wc
только считать строки ограничивает, это - внутренний парсинг так, чтобы это только считало эти вещи или просто только сообщило о результатах строк, даже при том, что это все еще считало все. – slm♦ 18.10.2013, 07:05