скорость трубы и перенаправления, `pv `и UUOC

Чтобы проверить, является ли аргумент скрипта 1или 2, вы можете просто использовать оператор case.

В приведенном ниже коде предполагается, что вы хотите проверить$1:

case $1 in
    [12])
        # $1 is 1 or 2
        ;;
    *)
        # $1 is not 1 and not 2
esac

Нет реальной необходимости проверять, является ли аргумент допустимым целым числом или нет, так как вас интересуют только два конкретных значения, и их можно легко проверить как строки. Значения переменных оболочки всегда являются строками, если они не используются в арифметическом контексте, и здесь нет причин делать это.

Вы также можете использовать явный оператор if:

if [ "$1" = '1' ] || [ "$1" = '2' ]; then
    # $1 is 1 or 2
else
    # $1 is not 1 and not 2
fi
3
03.09.2020, 22:40
1 ответ

Убийцей является использование двух процессов.

С cat | pv, catчтение и запись, и pvчтение и запись, и оба процесса должны работать:

$ perf stat sh -c 'cat /dev/zero | pv -s 100G -S > /dev/null'
 100GiB 0:00:26 [3.72GiB/s] [====================================================================================>] 100%            

 Performance counter stats for 'sh -c cat /dev/zero | pv -s 100G -S > /dev/null':

         34,048.63 msec task-clock                #    1.267 CPUs utilized          
         1,676,706      context-switches          #    0.049 M/sec                  
             3,678      cpu-migrations            #    0.108 K/sec                  
               304      page-faults               #    0.009 K/sec                  
   119,270,941,758      cycles                    #    3.503 GHz                      (74.89%)
   137,822,862,590      instructions              #    1.16  insn per cycle           (74.94%)
    32,379,369,104      branches                  #  950.974 M/sec                    (75.14%)
       216,658,446      branch-misses             #    0.67% of all branches          (75.04%)

      26.865741948 seconds time elapsed

       1.257950000 seconds user
      38.893870000 seconds sys

Только с pvесть только pvчтение и запись, переключение контекста не требуется (или почти не требуется):

$ perf stat sh -c '< /dev/zero pv -s 100G -S > /dev/null'
 100GiB 0:00:07 [13.3GiB/s] [====================================================================================>] 100%            

 Performance counter stats for 'sh -c < /dev/zero pv -s 100G -S > /dev/null':

          7,501.68 msec task-clock                #    1.000 CPUs utilized          
                37      context-switches          #    0.005 K/sec                  
                 0      cpu-migrations            #    0.000 K/sec                  
               198      page-faults               #    0.026 K/sec                  
    27,916,420,023      cycles                    #    3.721 GHz                      (75.00%)
    62,787,377,126      instructions              #    2.25  insn per cycle           (74.99%)
    15,361,951,954      branches                  # 2047.801 M/sec                    (75.03%)
        51,741,595      branch-misses             #    0.34% of all branches          (74.98%)

       7.505304560 seconds time elapsed

       1.768600000 seconds user
       5.733786000 seconds sys

Существует некоторый параллелизм («Используется 1,267 ЦП» ), но он не компенсирует огромную разницу в количестве переключений контекста.

Все могло быть и хуже, учитывая путь данных — в первом случае кажется, что данные перетекают из ядра(/dev/zerocat, обратно в ядро ​​(по каналу ), в pv, к ядру (/dev/null). Во втором случае данные перетекают из ядра в pvи обратно в ядро. Но в первом сценарии pvиспользуетspliceдля копирования данных из канала, избегая обхода памяти, принадлежащей ядру -.

8
18.03.2021, 23:07

Теги

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