Помоги мне, сосачик. Я пишу свою хуйню на C для максимально голые арч под двм, заточенные на энергоэффективность типа, но у меня нихуя не получается. Я пытаюсь как-то писать код, но гемини раз за разом меня унижает
>Текущий подход страдает от постоянного открытия/закрытия файлов и парсинга текста, что заставляет процессор совершать много лишних тактов и системных вызовов (syscalls). >Вот детальный разбор того, что нужно изменить, от простого к сложному: >1. Главная проблема: /proc/driver/rtc >Чтение /proc/driver/rtc — это очень дорогая операция для получения времени. Вы заставляете ядро генерировать текстовый отчет, который вы потом парсите. > Решение: Используйте стандартную библиотеку C (time.h). Это на порядки быстрее, так как часто time() и localtime() работают через vDSO (виртуальный системный вызов) и даже не требуют переключения в режим ядра. >2. Проблема ввода-вывода: fopen vs open >Функции fopen/fread (из stdio.h) используют буферизацию и структуры FILE. Для чтения 3 байт из /sys это избыточно. > Решение: Используйте низкоуровневые open, read, close (или lseek) из unistd.h и fcntl.h. Это уменьшит оверхед памяти и процессора. >3. Частота обновлений (Polling rate) >Батарея не меняет заряд каждую секунду. Читать файл /sys/.../capacity в каждом цикле — расточительство. > Решение: Обновляйте время каждую секунду, а заряд батареи — раз в 30 или 60 секунд. >4. X11 оптимизация >XStoreName отправляет данные на X-сервер. Если строка не изменилась, отправлять её не нужно. Хотя в вашем случае время меняется каждую секунду, но если вы решите убрать секунды, это станет критичным. >Оптимизированный код (Extreme Power Saving Edition) >Этот код использует нативные вызовы времени, низкоуровневое чтение и разделение частоты обновлений. >#include <stdio.h> >#include <stdlib.h> >#include <string.h> >#include <time.h> >#include <unistd.h> >#include <fcntl.h> >#include <X11/Xlib.h>
>// Путь к батарее (проверьте, BAT0 или BATT у вас) >#define BATT_CAP_PATH "/sys/class/power_supply/BATT/capacity" >// Обновлять батарею раз в N секунд (циклов) >#define BATT_UPDATE_INTERVAL 60
>int read_int_from_file(const char path) { > int fd = open(path, O_RDONLY); > if (fd == -1) return -1;
>Что еще можно улучшить (Hardcore): > Убрать секунды: > Если вам не нужны секунды на часах, вы можете переписать логику так, чтобы просыпаться раз в 60 секунд. Это даст колоссальный прирост энергоэффективности, так как процессор будет спать (C-states) 99.9% времени, не просыпаясь каждую секунду для перерисовки экрана. > Событийная модель (Event Driven): > Вместо sleep(1) можно использовать poll или select для ожидания событий, но для батареи это сложно (netlink сокеты), а для времени бессмысленно (оно течет линейно). > * Компиляция: > Используйте флаги оптимизации для уменьшения размера бинарника и ускорения кода (хотя для такого простого кода это микро-оптимизация): > gcc -O2 -march=native -s status.c -o status -lX11 >Итог по вашему коду: >Самое "узкое" место в оригинале — это fopen("/proc/driver/rtc", ...) внутри бесконечного цикла. Замена этого на time() и localtime() снизит нагрузку на CPU практически до нуля.
Как избавиться от этой ебаной фиксации на эффективности?
>>327475101 (OP) Через несколько лет и несколько недоведенных до мвп проектов само пройдет. Тебе в данный момент хочется пердолиться, а не реализовывать, вот ты и пердолишься.
>>327475193 Мне мвп нахуй не нужон, потому что я для себя пишу. А стремление к пердолингу вряд ли закончится, потому что энергоэффективность и пердолинг идут бок о бок
>>327475275 Смотри не сломай себе дофаминовую обратную связь, занимаясь дрочевом без четко видимого результата. А то перехочется пердолиться в один момент - а по жизни ты больше ничего не умеешь.
>>327475324 Моя проблема как раз в том, что он четко видимый. Я доделал статус-бар ещё вчера ночью и не собираюсь, вроде, его трогать, но меня гложет эта хуйня. Я знаю, что он не идеальный
>>327475335 Я все равно примерно понимаю, в чем проблема кода. Нейронка тут следствие, а не причина
>>327475101 (OP) >Двач, я слабоумный олигофрен и ничего не могу решить сам. Давай погугли за меня, почитай, мне расскажи и вариантиков накидай. Давай сразу на хуй.
>>327475101 (OP) > Как избавиться от этой ебаной фиксации на эффективности? Ебанутый, ты слип делаешь. Пиздец, дочитал до этого момента и охуел. Иди нахуй просто, слушай нейросеть, если ты сам такой даун.
Статус батареи/часов и любых нахуй не нужных системных таймеров нужно раз в 5 минут, делать интерполяцию и хуй забивать.
>>327475101 (OP) > Как избавиться от этой ебаной фиксации на эффективности? Водочки выпить блядь. Че ты пишешь? Хелло ворлд с прогресс баром?
Тебе надо чтобы работало, или ты там борешься за каждый бит памяти? Если первое иди к психиатру он поможет избавиться от навязчивого перфекционизма. Если второе гугли, а не нейросеть используй.
>>327475446 >Моя проблема как раз в том, что он четко видимый. Я доделал статус-бар ещё вчера ночью и не собираюсь, вроде, его трогать, но меня гложет эта хуйня. Я знаю, что он не идеальный Открываешь себе ишью либо хуяришь туду в коде комментом, мы же знаем, что ты не юзаешь гитхаб для своих поделок и говоришь, что когда-нибудь поправишь. Распыляться сейчас на преждевременную оптимизацию значит не доделать проект вовсе. А недоделанный проект намного хуже, чем доделанный но не совершенный. Возможно также, что твоё топтание на месте с оптимизацией это такая завуалированная лень. Типо ты вообще не знаешь, как заканчивать проект, но представляешь как делать оптимизации. И твой мозг подсознательно пытается не заканчивать этот этап.
>>327477929 >А гит вообще нужен для таких поделок? Разве что, чтобы удобно переключаться между изменениями. Но я бы рекомендовал уже к нему привыкать, чтобы потом не осваивать отдельно.
>Алсо, совет крайне годный, спасибо В целом, переставай смотреть на свою работу как на какой-то финальный результат, и смотри как на функцию от усилий и времени, которых у тебя, очевидно, не бесконечное количество. Охуеешь как вырастет твоя продуктивность. Не обращай внимание, что качество поначалу просядет - за счет большего количества практики, вместо дрочения одних и тех же оптимизаций, оно быстро пойдет вверх.
>>327477652 >Потому что мне не нравится ооп Разве в расте жесткое ооп, которому обязательно следовать? Мне всегда казалось наоборот, но я только смарт контракты на его диалекте писал, сам раст не трогал.
>Текущий подход страдает от постоянного открытия/закрытия файлов и парсинга текста, что заставляет процессор совершать много лишних тактов и системных вызовов (syscalls).
>Вот детальный разбор того, что нужно изменить, от простого к сложному:
>1. Главная проблема: /proc/driver/rtc
>Чтение /proc/driver/rtc — это очень дорогая операция для получения времени. Вы заставляете ядро генерировать текстовый отчет, который вы потом парсите.
> Решение: Используйте стандартную библиотеку C (time.h). Это на порядки быстрее, так как часто time() и localtime() работают через vDSO (виртуальный системный вызов) и даже не требуют переключения в режим ядра.
>2. Проблема ввода-вывода: fopen vs open
>Функции fopen/fread (из stdio.h) используют буферизацию и структуры FILE. Для чтения 3 байт из /sys это избыточно.
> Решение: Используйте низкоуровневые open, read, close (или lseek) из unistd.h и fcntl.h. Это уменьшит оверхед памяти и процессора.
>3. Частота обновлений (Polling rate)
>Батарея не меняет заряд каждую секунду. Читать файл /sys/.../capacity в каждом цикле — расточительство.
> Решение: Обновляйте время каждую секунду, а заряд батареи — раз в 30 или 60 секунд.
>4. X11 оптимизация
>XStoreName отправляет данные на X-сервер. Если строка не изменилась, отправлять её не нужно. Хотя в вашем случае время меняется каждую секунду, но если вы решите убрать секунды, это станет критичным.
>Оптимизированный код (Extreme Power Saving Edition)
>Этот код использует нативные вызовы времени, низкоуровневое чтение и разделение частоты обновлений.
>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>#include <time.h>
>#include <unistd.h>
>#include <fcntl.h>
>#include <X11/Xlib.h>
>// Путь к батарее (проверьте, BAT0 или BATT у вас)
>#define BATT_CAP_PATH "/sys/class/power_supply/BATT/capacity"
>// Обновлять батарею раз в N секунд (циклов)
>#define BATT_UPDATE_INTERVAL 60
>int read_int_from_file(const char path) {
> int fd = open(path, O_RDONLY);
> if (fd == -1) return -1;
> char buf[16];
> ssize_t bytes_read = read(fd, buf, sizeof(buf) - 1);
> close(fd);
> if (bytes_read > 0) {
> buf[bytes_read] = '\0';
> return atoi(buf);
> }
> return 0;
>}
>int main(void) {
> Display dpy = XOpenDisplay(NULL);
> if (!dpy) {
> fprintf(stderr, "Cannot open display\n");
> return 1;
> }
> Window root = DefaultRootWindow(dpy);
> char status[128];
> time_t rawtime;
> struct tm timeinfo;
> int battery_percent = 0;
> int cycle_counter = BATT_UPDATE_INTERVAL; // Чтобы обновить батарею сразу при старте
> for (;;) {
> // 1. Получаем время (супер быстро через vDSO)
> time(&rawtime);
> timeinfo = localtime(&rawtime);
> // 2. Читаем батарею только раз в BATT_UPDATE_INTERVAL секунд
> if (cycle_counter >= BATT_UPDATE_INTERVAL) {
> battery_percent = read_int_from_file(BATT_CAP_PATH);
> cycle_counter = 0;
> }
> // 3. Форматируем строку
> // %H:%M:%S - часы:минуты:секунды
> // Используем strftime для эффективного форматирования времени
> char time_str[24];
> strftime(time_str, sizeof(time_str), "%Y-%m-%d | %H:%M:%S", timeinfo);
> snprintf(status, sizeof(status), " %d%% | %s ", battery_percent, time_str);
> // 4. Отправляем в X11
> XStoreName(dpy, root, status);
> XSync(dpy, False);
> cycle_counter++;
> sleep(1);
> }
> XCloseDisplay(dpy);
> return 0;
>}
>Что еще можно улучшить (Hardcore):
> Убрать секунды:
> Если вам не нужны секунды на часах, вы можете переписать логику так, чтобы просыпаться раз в 60 секунд. Это даст колоссальный прирост энергоэффективности, так как процессор будет спать (C-states) 99.9% времени, не просыпаясь каждую секунду для перерисовки экрана.
> Событийная модель (Event Driven):
> Вместо sleep(1) можно использовать poll или select для ожидания событий, но для батареи это сложно (netlink сокеты), а для времени бессмысленно (оно течет линейно).
> * Компиляция:
> Используйте флаги оптимизации для уменьшения размера бинарника и ускорения кода (хотя для такого простого кода это микро-оптимизация):
> gcc -O2 -march=native -s status.c -o status -lX11
>Итог по вашему коду:
>Самое "узкое" место в оригинале — это fopen("/proc/driver/rtc", ...) внутри бесконечного цикла. Замена этого на time() и localtime() снизит нагрузку на CPU практически до нуля.
Как избавиться от этой ебаной фиксации на эффективности?