Тройник BusyBox работает очень медленно

Я считаю, что самая простая команда это

sort -t- -k3.1,3.4 -k2,2 file

Это сортирует по четырем символам третьего поля и разрешает ничьи путем сортировки по второму полю. Если ничьи все еще не разрешены, порядок будет определен автоматически путем сравнения всех остальных полей, начиная с первого.

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

Образец для испытаний:

06-12-2016,12:00,gym,leg day
05-04-2018,12:09,gym,hands
09-08-2019,13:11,movies,horror
09-08-2019,13:09,movies,horror
09-08-2019,13:08,movies,horror
08-08-2019,13:09,movies,horror
05-04-2019,14:07,gym,hands
23-03-2018,16:47,dance class
25-04-2019,13:29,dance class
05-12-2017,14:45,songwriting

Отсортированный результат:

06-12-2016,12:00,gym,leg day
05-12-2017,14:45,songwriting
23-03-2018,16:47,dance class
05-04-2018,12:09,gym,hands
05-04-2019,14:07,gym,hands
25-04-2019,13:29,dance class
08-08-2019,13:09,movies,horror
09-08-2019,13:08,movies,horror
09-08-2019,13:09,movies,horror
09-08-2019,13:11,movies,horror
1
07.12.2020, 00:01
1 ответ

В последней версии busybox -1.32 параметр конфигурации FEATURE _TEE _USE _BLOCK _IO для оптимизации производительности teeапплет установлен на "да" по умолчанию:

config FEATURE_TEE_USE_BLOCK_IO
bool "Enable block I/O (larger/faster) instead of byte I/O"
default y
depends on TEE
help
Enable this option for a faster tee, at expense of size.

В busybox -1.15 для этого же параметра по умолчанию установлено значение "нет" . Это может объяснить, почему teeработает медленно в вашей системе с busybox -1.15 .

Подробнее:

Когда ФУНКЦИЯ _ТРОЙНИК _ИСПОЛЬЗОВАНИЕ _БЛОК _В/В не установлено , teeвыполняет посимвольное копирование своего ввода (с getchar())на его выходы (с putc()):

    setvbuf(stdout, NULL, _IONBF, 0);
    while ((c = getchar()) != EOF) {
        fp = files;
        do
            putc(c, *fp++);
        while (*fp);
    }

Когда для ФУНКЦИЯ _ТРОЙНИК _ИСПОЛЬЗОВАНИЕ _БЛОК _В/В установлено , teeвместо этого используется копия из буфера:

    while ((c = safe_read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
        fp = files;
        do
            fwrite(buf, 1, c, *fp++);
        while (*fp);
    }
2
18.03.2021, 22:44

Теги

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