как исправить выражение jq, возвращающее ошибку Invalid path expression?

Помимо «все является файлом» и, следовательно, простоты использования везде, на чем основано большинство других ответов, существует также проблема с производительностью, как упоминает @user5626466.

Чтобы показать это на практике, мы создадим простую программу с именемnullread.c:

#include <unistd.h>
char buf[1024*1024];
int main() {
        while (read(0, buf, sizeof(buf)) > 0);
}

и скомпилируйте его сgcc -O2 -Wall -W nullread.c -o nullread

(Примечание :мы не можем использовать lseek (2 )для каналов, поэтому единственный способ опустошить канал — это читать из него, пока он не станет пустым ).

% time dd if=/dev/zero bs=1M count=5000 | ./nullread
5242880000 bytes (5,2 GB, 4,9 GiB) copied, 9,33127 s, 562 MB/s
dd if=/dev/zero bs=1M count=5000  0,06s user 5,66s system 61% cpu 9,340 total
./nullread  0,02s user 3,90s system 41% cpu 9,337 total

в то время как при стандартном /dev/nullперенаправлении файлов мы получаем гораздо лучшую скорость (из-за упомянутых фактов :меньшее переключение контекста, ядро ​​​​просто игнорирует данные вместо их копирования и т. д.):

% time dd if=/dev/zero bs=1M count=5000 > /dev/null
5242880000 bytes (5,2 GB, 4,9 GiB) copied, 1,08947 s, 4,8 GB/s
dd if=/dev/zero bs=1M count=5000 > /dev/null  0,01s user 1,08s system 99% cpu 1,094 total

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

5
13.03.2020, 17:03
0 ответов

Теги

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