Описание тега tichu
Я только собираюсь дать некоторые общие рекомендации в этом ответ, а не ориентиры. Критерии представляют собой единственный путь достоверно ответить на вопросы о производительности. Но поскольку вы не говорите, сколько данных вы собираетесь работать и как часто вы выполняете эту операцию, нет никакого способа сделать полезный ориентир. Что более эффективно на 10 пунктов и более эффективного для 1000000 элементов часто не совпадают.
Как правило, вызов внешних команд дороже, чем делать что-то с чистого создает оболочку, пока чистый шелл-код не предполагает наличие петель. С другой стороны, цикл снаряд, который перебирает строки большого или большого количества строк может быть медленнее, чем один вызов специального инструмента. Например, ваш цикл вызова отрезка
может быть значительно снижена на практике, но если вы найдете способ сделать все это с помощью одного отрезка
вызов, который, вероятно, будет быстрее, чем делать то же самое со строкой манипуляций в оболочке.
Отметим, что точка отсечки могут розниться между системами. Это может зависеть от ядра, как планировщик в ядре настроено, на файловая система, содержащая внешние исполняемые файлы, на сколько ЦП давления против памяти есть на данный момент и многих других факторов.
Не называй выражение
для выполнения арифметических, если вы вообще обеспокоены производительности. На самом деле, не называть выражение
для выполнения арифметических вообще. Снаряды имеют встроенную арифметику, которая нагляднее и быстрее, чем вызывая выражение
.
Вы, кажется, используете bash, поскольку вы используете конструкции Баш, которых нет в СХ. Так почему на Земле бы вы не использовать массив? Массив является наиболее естественным решением, и это, вероятно, будет самым быстрым, слишком. Обратите внимание, что индексы массивов начинаются с 0.
список=(1 2 3 5 9 8 6 90 84 9 3 2 15 75 55)
для ((счетчик = 0; счетчик += 3; считать < ${#список[@]})); делать
Эхо "${список[$граф]}"
сделано
Ваш сценарий вполне может быть быстрее, если вы используете SH, если ваша система имеет черточки или КШ как ш
, а не Баш. Если вы используете SH, вы не получите именованные массивы, но вы все равно получите массив один из позиционных параметров, которые можно установить с набором
. Для доступа к элементу в позиции, которая не известна до времени выполнения, вы должны использовать функцию eval
(заботиться о цитировании вещи правильно!).
Элементы списка не должны содержать пробелы или ?*\[
список='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
набор $список
кол-во=1
в то время как [ $считать -Ле $# ]; делать
ивала "значение=\${$граф}"
Эхо "$значение"
граф=$((счетчик+1))
сделано
Если вы только хотите получить доступ к массиву один раз и идут слева направо (пропуск некоторых значений), вы можете использовать сдвиг
вместо переменной индексов.
Элементы списка не должны содержать пробелы или ?*\[
список='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
набор $список
в то время как [ $# -GE на 1 ]; делать
Эхо "$1"
сдвиг && сдвиг && сдвиг
сделано
Какой подход быстрее зависит от оболочки и от количества элементов.
Другая возможность заключается в использовании обработки строки. Он имеет преимущество не использовать позиционные параметры, поэтому вы можете использовать их для чего-то другого. Это будет медленнее, для больших объемов данных, но это вряд ли сделает заметную разницу для небольших объемов данных.
Элементы списка # должны быть разделены одиночным пробелом (не произвольные пробельные символы)
список='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
в то время как [ -Н "$список" ]; делать
Эхо "${список% *}"
случае "$список" в *\ *\ *\ *) :;; *) перерыв;; эсок
список="${список#* * * }"
сделано