Почему при запуске моего терминала bash один и тот же набор команд выполняется дважды?

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

В Perl есть PerlIO ::gzip , который позволяет напрямую читать сжатые gzip-потоки. Следовательно, он может иметь преимущество, даже если его скорость декомпрессии может не соответствовать скорости unpigz:

.

#!/usr/bin/env perl

use strict;
use warnings;

use autouse Carp => 'croak';
use PerlIO::gzip;

@ARGV or croak "Need filename\n";

open my $in, '<:gzip', $ARGV[0]
    or croak "Failed to open '$ARGV[0]': $!";

1 while <$in>;

print "$.\n";

close $in or croak "Failed to close '$ARGV[0]': $!";

Я попробовал это со сжатым файлом gzip размером 13 МБ (распаковывает до 1,4 ГБ )на старом MacBook Pro 2010 года с 16 ГБ ОЗУ и на старом ThinkPad T400 с 8 ГБ RAM с файлом, уже находящимся в кеше. На Mac скрипт Perl был значительно быстрее, чем при использовании конвейеров (5 секунд против 22 секунд ), но на ArchLinux он проиграл unpigz :

.

$ time -p./gzlc.pl spy.gz 
1154737
real 4.49
user 4.47
sys 0.01

против

$ time -p unpigz -c spy.gz | wc -l
1154737
real 3.68
user 4.10
sys 1.46

и

$ time -p zcat spy.gz | wc -l
1154737
real 6.41
user 6.08
sys 0.86

Очевидно, что использование unpigz -c file.gz | wc -lявляется выигрышным как с точки зрения скорости, так и с точки зрения скорости. И эта простая командная строка, безусловно, превосходит написание программы, какой бы короткой она ни была.

1
02.08.2019, 18:18
1 ответ

Ничто в коде, который вы показываете, не печатает вывод, который вы показываете, поэтому он должен исходить из какой-то части, которую вы не показываете.

Вы должны быть в состоянии найти виновника самостоятельно или, по крайней мере, изолировать небольшую проблемную часть со следующей информацией:

  • В macOS каждый терминал по умолчанию открывает оболочку входа.
  • Когда bash запускается в качестве оболочки входа в систему, он выполняет команды из ~/.bash_profile.
  • Поместите set -xвверху .bash_profile, и bash будет печатать трассировку каждой команды непосредственно перед ее выполнением. Это будет выглядеть так :
    + export AD_USERNAME=myfirstname.mylastname
    + AD_USERNAME=myfirstname.mylastname
    + yodle_dev_include_repo_prompt=1
    + source /home/intA/.dev-shell-utils/conf/sh/all
    …
    
    Поэтому проверьте, какие команды (и )выводят этот нежелательный вывод.
1
28.01.2020, 00:04

Теги

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