LINUX.ORG.RU

pictura-stainless 1.0.0 — легковесный аналог Pictura Noctis

 , , , ,

pictura-stainless 1.0.0 — легковесный аналог Pictura Noctis

1

3

Опубликован выпуск pictura-stainless 1.0.0 — утилиты для установки случайных обоев в Noctalia Shell (Quickshell). Проект создан как лёгкая и более быстрая альтернатива недавно вышедшей утилите Pictura Noctis, с добавлением поддержки других WM (автор использует sway).

Основные отличия

  • Скорость сборки и размер: программа не зависит от экосистемы крейтов и собирается Makefile слишком быстро.

  • Не все флаги совместимы.

  • Режим для скриптов: добавлен флаг -p, который печатает только путь к выбранному изображению, что упрощает использование утилиты c другими бэкендами обоев:

swaymsg output "*" bg "$(./pictura-stainless -p ~/Pictures/Wallpapers)" fill
Требования и сборка

Для сборки требуется GCC 13 или Clang 16 и выше:

git clone https://github.com/x6prl/pictura-stainless.git
cd pictura-stainless
make
make install PREFIX=$HOME/.local

GCC младше 14 и Clang младше 18:

make CSTD=gnu2x

Нестрипнутый исполняемый файл может показаться великоват

$./pictura-stainless -v
pictura-stainless 1.0.0
$du -h pictura-stainless
24K	pictura-stainless

Но strip позволит сократить его размер ещё на 4KБ.

Исходный код написан на языке Си и распространяется под лицензией GPLv3.

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

Инструкции по интеграции с вашим любимым WM

Собранные бинарники для x86_64 и aarch64

>>> Репозиторий проекта на GitHub

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от BruteForce

Я всё ещё не знаю, что это такое.

утилиты для установки случайных обоев в Noctalia Shell (Quickshell)

То есть для заявленного в шапке применения программа даже не тестировалась?

hobbit ★★★★★
()
Ответ на: комментарий от saahriktu

Нет, кол-во syscall’ов осталось примерно таким же, как и у сабжевой версии на Си

Ок, sys time одинаковое.

скорость должна быть такая же.

Что значит «должна» кому и почему? Как ты это определяешь? Почему не померить?

по-настоящему это можно заметить только на больших коллекциях.

Ну, на моей небольшой, 7782 files in 37 directories, 6872 images, видно только отставание.

Вот такой бенч тебе ещё, 896146 файлов, 125616 директорий и 1952 картинков:

$ taskset -c 6 hyperfine \                                                                                                             main
                               -N \
                               --warmup 20 \
                               --runs 200 \
                               "../pictura-stainless/pictura-stainless -rp QWERTY" \
                               "./target/release/pictura_noctis --recursive --dry-run QWERTY"
Benchmark 1: ../pictura-stainless/pictura-stainless -rp /home/QWERTY
  Time (mean ± σ):     465.2 ms ±   1.5 ms    [User: 62.1 ms, System: 402.8 ms]
  Range (min … max):   463.1 ms … 473.2 ms    200 runs
 
Benchmark 2: ./target/release/pictura_noctis --recursive --dry-run /home/QWERTY
  Time (mean ± σ):     583.7 ms ±   2.3 ms    [User: 172.1 ms, System: 411.3 ms]
  Range (min … max):   581.0 ms … 598.1 ms    200 runs
 
  Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options.
 
Summary
  ../pictura-stainless/pictura-stainless -rp /home/QWERTY ran
    1.25 ± 0.01 times faster than ./target/release/pictura_noctis --recursive --dry-run /home/QWERTY
$ ../pictura-stainless/pictura-stainless -r $HOME/src
found 896146 files in 125616 checked directories
total images found: 19526
chosen image path: /home/QWERTY/xfwm4/assets-Light-Macos-hdpi/shade-prelight.png
command 'qs' not found; make sure Quickshell is installed

Отставание твоего кода практически трёхкратное.

В моих собственных тестах Pictura Noctis тратит до +20 мс больше чем сабжевая версия на Си просто потому, что logging, tracing

Там вывод ровно трёх строчек:

2026-09-25T07:51:34.904637Z  INFO pictura_noctis: candidate selected images_found=6872 selected=/home/QWERTY.jpg
/home/QWERTY.jpg
2026-09-25T07:51:34.904655Z  INFO pictura_noctis: dry-run mode: skipping wallpaper update

Ты правда считаешь, что они едят 20мс? Ну отключи их и сравни.

и красивое ожидание завершения qs не бесплатные по времени.

Я чекаю с dry-run, посмотри мою команду. Даже попытки запуска qs не происходит же. Или я неверно dry-run понимаю?

П.С. А регрессии-то были? Ты пофиксил?

BruteForce ★★★★★
() автор топика
Ответ на: комментарий от BruteForce

Там вывод ровно трёх строчек

Это результат, но не сами logging и tracing. Суть в том, что они выполняются отдельными заточенными на это дело библиотеками и им нужно время на прогрев и работу.

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

Сабжевая программа на Си просто ждёт сигнал о завершении, а Pictura Noctis делает иначе. Она периодически проверяет завершился ли процесс qs или нет. И, вообще-то, она может ждать даже до часа. На практике до +25 мс может пройти уже после установки обои и до окончания ожидания завершения qs.

Ну, OK, прогнал тест ещё раз на большой директории с поддиректориями. Разница оказалась больше чем 20 мс, но и не в несколько раз. pictura-stainless отработала примерно на 10% быстрее - за 18.96 с против 21.02 с у Pictura Noctis.

Однако, при этом Max RSS у pictura-stainless была в ~28 раз больше.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

о они выполняются отдельными заточенными на это дело библиотеками и им нужно время на прогрев и работу.

Они что, делают прогрев на каждой директории? Сколько времени идёт этот твой прогрев и зачем вообще он нужен в пикере обоев?

на большой директори

Однако, при этом Max RSS у pictura-stainless была в ~28 раз больше.

Это логично, там же размер хешмапы 128 МБ. Сколько у тебя там директорий? Полмиллиона? Если память у тебя ботлнек (очевидно нет), замени << 23 на << 20.

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

Я тебе третий раз говорю, что ты подчёркиваешь её абсолютно случайно.

Разница оказалась больше чем 20 мс, но и не в несколько раз. pictura-stainless отработала примерно на 10% быстрее - за 18.96 с против 21.02 с у Pictura Noctis.

Ты можешь дать более подробные данные?

BruteForce ★★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от BruteForce

Ты можешь дать более подробные данные?

$ /usr/bin/time -v ~/x4021/bin/pictura_noctis --recursive --dry-run /mnt/mpt1/old2025/
...
2026-09-25T08:25:59.362834Z  INFO pictura_noctis: dry-run mode: skipping wallpaper update
        Command being timed: "/home/saahriktu/x4021/bin/pictura_noctis --recursive --dry-run /mnt/mpt1/old2025/"
        User time (seconds): 0.08
        System time (seconds): 0.32
        Percent of CPU this job got: 1%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:21.02
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 4796
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 22
        Minor (reclaiming a frame) page faults: 812
        Voluntary context switches: 34552
        Involuntary context switches: 45
        Swaps: 0
        File system inputs: 279304
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
$ /usr/bin/time -v /mnt/mpt1/new2026/x4021/tmp/pictura-stainless-1.0.0/pictura-stainless --recursive --dry-run /mnt/mpt1/old2025/
found 230052 files in 32469 checked directories
total images found: 83128
chosen image path: <cut>
        Command being timed: "/mnt/mpt1/new2026/x4021/tmp/pictura-stainless-1.0.0/pictura-stainless --recursive --dry-run /mnt/mpt1/old2025/"
        User time (seconds): 0.03
        System time (seconds): 0.29
        Percent of CPU this job got: 1%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:18.96
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 136424
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 1
        Minor (reclaiming a frame) page faults: 596
        Voluntary context switches: 34528
        Involuntary context switches: 26
        Swaps: 0
        File system inputs: 276256
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
$ strace -c -f /mnt/mpt1/new2026/x4021/tmp/pictura-stainless-1.0.0/pictura-stainless --recursive --dry-run /mnt/mpt1/old2025/ 2>&1 | tail -30
found 230052 files in 32469 checked directories
total images found: 83128
chosen image path: <cut>
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 42,74    0,101948           1     65090           getdents64
 23,74    0,056620           0     65278           newfstatat
 19,91    0,047505           1     32471           openat
 12,80    0,030537           0     32471           close
  0,81    0,001932           2       741           brk
  0,00    0,000003           3         1           write
  0,00    0,000000           0         1           read
  0,00    0,000000           0         9           mmap
  0,00    0,000000           0         3           mprotect
  0,00    0,000000           0         1           munmap
  0,00    0,000000           0         2           pread64
  0,00    0,000000           0         1         1 access
  0,00    0,000000           0         1           execve
  0,00    0,000000           0         1           arch_prctl
  0,00    0,000000           0         1           set_tid_address
  0,00    0,000000           0         1           set_robust_list
  0,00    0,000000           0         1           prlimit64
  0,00    0,000000           0         2           getrandom
  0,00    0,000000           0         1           rseq
------ ----------- ----------- --------- --------- ----------------
100,00    0,238545           1    196077         1 total
$ strace -c -f ~/x4021/bin/pictura_noctis --recursive --dry-run /mnt/mpt1/old2025/ 2>&1 | tail -30
2026-09-25T09:23:50.454565Z  INFO pictura_noctis: dry-run mode: skipping wallpaper update
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ------------------
 41,63    0,092296           1     65090           getdents64
 18,55    0,041121           1     33142           statx
 16,73    0,037081           1     32473           openat
 11,92    0,026423           0     32473           close
 11,10    0,024614           0     32473           newfstatat
  0,04    0,000098          16         6           munmap
  0,01    0,000023           1        17           mmap
  0,00    0,000010           3         3           write
  0,00    0,000010           1         8           brk
  0,00    0,000002           0         3           sigaltstack
  0,00    0,000001           0         2           getrandom
  0,00    0,000000           0         5           read
  0,00    0,000000           0         1           poll
  0,00    0,000000           0         5           mprotect
  0,00    0,000000           0         5           rt_sigaction
  0,00    0,000000           0         2           pread64
  0,00    0,000000           0         1         1 access
  0,00    0,000000           0         1           execve
  0,00    0,000000           0         1           arch_prctl
  0,00    0,000000           0         1           gettid
  0,00    0,000000           0         1           sched_getaffinity
  0,00    0,000000           0         1           set_tid_address
  0,00    0,000000           0         1           set_robust_list
  0,00    0,000000           0         2           prlimit64
  0,00    0,000000           0         1           rseq
------ ----------- ----------- --------- --------- ------------------
100,00    0,221679           1    195718         1 total
$
saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от BruteForce

Это ни разу не заметная разница.

ты подчёркиваешь её абсолютно случайно.

No. Pictura Noctis теряет время именно на старте и завершении, а не в процессе выполнения основной задачи.

saahriktu ★★★★★
()
Ответ на: комментарий от BruteForce

50 мс это вообще-то офигеть как заметно человеком!

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от BruteForce

А разница бывает не только по времени. Вон, выше уже упоминалась та же разница в Max RSS.

А бывает разница в контроле за процессом. В bash'е никто так процесс не проконтролирует как из программы на Rust или C/C++.

saahriktu ★★★★★
()
Ответ на: комментарий от BruteForce

Кстати, если файлов миллионы, то команда на bash'е начнёт жрать гигабайты RAM. А Pictura Noctis не начнёт, т.к. не хранит весь список файлов в RAM.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 2)
Ответ на: комментарий от saahriktu

О чем речь?

Ты как-то очень избирательно мне отвечаешь, не находишь?

BruteForce ★★★★★
() автор топика
Последнее исправление: BruteForce (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Мы уже выяснили, что у тебя 1500 картинок без симлинков. О каких гигабайтах рам при выполнении bash ты говоришь?

BruteForce ★★★★★
() автор топика
Ответ на: комментарий от BruteForce

Так я программу не только для себя же сделал. Плюс, я ещё не знаю сколько их у меня будет, например, лет через 10.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Покажи, пожалуйста, в коде, о чем ты говоришь? И для чего это надо? И как потеря времени в начале и в конце начинает рости при запуске на большом кол-ве директорий, что твой код на расте отстаёт почти в три раза?

BruteForce ★★★★★
() автор топика
Ответ на: комментарий от BruteForce

О чем речь?

Много о чём. Например, если выполнение задачи упадёт, то shuf или xargs не скажут почему.

А программа на Rust может выдать, например:

no supported images found
или
Noctalia Shell failed
.

saahriktu ★★★★★
()
Ответ на: комментарий от BruteForce

Это форум. Какие вопросы - такие и ответы. И да, отвечать и отчитываться я вообще не обязан.

saahriktu ★★★★★
()
Ответ на: комментарий от BruteForce

как потеря времени в начале и в конце начинает рости при запуске на большом кол-ве директорий

Никак. Надо правильнее тестировать.

По моим тестам Pictura Noctis медленнее разве что на 10%, не больше.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)

и собирается Makefile слишком быстро.

Ну расставь sleep 5 в разных местах, если слишком.

ЗЫ

это шутка. Я смотрю, на автора и так наехали по поводу и без повода, так что решил уточнить.

usermod ★★
()
Последнее исправление: usermod (всего исправлений: 1)
Ответ на: комментарий от thesis

Обои в шеле… это что-то из запрещённых видов извращений?

anc ★★★★★
()
Ответ на: комментарий от BruteForce

Вот бы кто-то устроил нормальное сравнение разных вариантов установки случайных обоев в Noctalia Shell

Обои в шеле… этому название уже придумали или ещё нет?

anc ★★★★★
()

pictura-stainless … Pictura Noctis

Кто все эти люди?

утилиты для установки случайных обоев в Noctalia Shell (Quickshell).

А, ясно-понятно. Автор молодец, в первом же абзаце объяснил. …Хотя не покидает сомнение:

… Noctalia Shell (Quickshell)

А это кто? :)

dimgel ★★★★★
()
Ответ на: комментарий от dimgel

А это кто? :)

«пользовательское окружение, способное функционировать поверх любых композитных менеджеров, поддерживающих Wayland-протокол layer-shell, например, Niri, Hyprland, Sway, Scroll, Mango, Labwc, Triad и dwl. ... Предлагаемое проектом Noctalia окружение включает в себя панель, меню запуска программ, конфигуратор, хранитель экрана, систему вывода уведомлений, систему управления сеансами, механизм просмотра истории буфера обмена, набор виджетов и экран входа в систему. При разработке используются возможности протокола Wayland и графического API OpenGL ES, без применения готовых тулкитов, таких как Qt и GTK. Компоненты среды рабочего стола развиваются как унифицированный стек, использующий единое оформление, конфигурацию и IPC. Настройки определяются в формате TOML и могут изменяться на лету, без перезапуска оболочки.

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

saahriktu ★★★★★
()
Ответ на: комментарий от MKuznetsov

Если каждая портянка будет сама внутри себя перебирать файлы и каталоги, это ппц.

Такое бывает разумнее сделать уже внутри кода который занимается обработкой найденного чем городить костыли с вызовом внешнего find и т.п.

anc ★★★★★
()
Ответ на: комментарий от saahriktu

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

dimgel ★★★★★
()

утилиты для установки случайных обоев в Noctalia Shell (Quickshell)

Прочитал как «утилиты для устранения случайных сбоев» …

Vic ★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.