Рубрика «sleep»

Не так давно мимо нас пробегала неплохая статья об ужасном состоянии производительности современного ПО (оригинал на английском, перевод на Хабре). Эта статья напомнила мне об одном антипаттерне кода, который встречается весьма часто и в общем кое-как работает, но приводит к небольшим потерям производительности то тут, то там. Ну, знаете, мелочь, пофиксить которую руки никак не дойдут. Беда лишь в том, что десяток таких «мелочей», разбросанных в разных местах кода начинают приводить к проблемам типа «вроде у меня последний Intel Core i7, а прокрутка дёргается».

Как правильно и неправильно спать - 1Я говорю о неверном использовании функции Sleep (регистр может отличаться в зависимости от языка программирования и платформы). Итак, что же такое Sleep? Документация отвечает на этот вопрос предельно просто: это пауза в выполнении текущего потока на указанное количество миллисекунд. Нельзя не отметить эстетическую красоту прототипа данной функции:

void Sleep(DWORD dwMilliseconds);

Всего один параметр (предельно понятный), никаких кодов ошибок или исключений — работает всегда. Таких приятных и понятных функций очень мало!

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

Функция идёт к планировщику потоков ОС и говорит ему «мы с моим потоком хотели бы отказаться от выделенного нам ресурса процессорного времени, сейчас и ещё на вот столько-то миллисекунд в будущем. Отдайте бедным!». Слегка удивлённый подобной щедростью планировщик выносит функции благодарность от имени процессора, отдаёт оставшийся кусок времени следующему желающему (а такие всегда найдутся) и не включает вызвавший Sleep поток в претенденты на передачу ему контекста выполнения на указанное количество миллисекунд. Красота!

Что же могло пойти не так? То, что программисты используют эту замечательную функцию не для того, для чего она предназначена.
Читать полностью »

В рамках одного из моих проектов, я провел небольшое исследование — как медленный интерфейс влияет на поведение пользователя?

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

Эксперимент проводился довольно просто, по принципу A/B тестирования. Аудитория A работала с сервисом «быстро», так как они и работает. А у аудитории B при отдаче каждой страницы был сделан sleep на 700 миллисекунд.
Читать полностью »

Некоторым людям повезло с железом компьютера. Берешь загрузочную флешку, ставишь линукс, всё работает из коробки и ты не знаешь проблем. Но бывает и так, что для того, чтобы какой-то модуль заработал, приходится поплясать.
Об одном из таких танцев и будет этот пост.

image

Раньше работая на линуксе, я не знал никаких проблем. Так получилось, что мне на некоторое время пришлось пересесть на другой компьютер. Как и полагается, поставил линукс. Я его брал с собой, поэтому практически сразу же была обнаружена проблема: ноутбук не выходит из сна и из гибернации. Просто черный экран и всё. Даже подсветка не включается.
Читать полностью »

Пишу игрушечную ОС (о реализации sleep)
Очередной пост для блога, посвященного работе над игрушечной ОС. В прошлый раз я писал про необходимость в простеньком драйвере AHCI (SATA). Прежде чем начать двигаться в этом направлении, я решил набросать инфраструктуру драйверов: общий интерфейс драйвера + уточнённый интерфейс драйвера устройства хранения. Формулирование этих интерфейсов выявила проблему, на которую я ранее не обращал внимания — проблему портируемости.

Не зависящий от платформы код (например, большая часть планировщика, вспомогательный код типа kprintf, ...) у меня перемешивается с кодом, заточенным только под x86_64 (системные таблицы дескрипторов, APIC, прерывания, ...). Хотя ничего не мешало мне сформулировать интерфейс драйвера, жёстко привязанного к x86_64 (в частности, свободно оперировать PCI-адресами), мне стало ясно, что без чёткого отделения кода, специфичного для конкретной платформы, от общего портируемого кода я буду лишь усугублять ситуацию. Итак, я принял решение перебрать всё написанное, отделив общий код (в корне src/) от кода, специфичного для платформы (в src/x86_64/). Этим я и занимался последние две недели.
Читать полностью »

Джофф Гарен (Geoff Garen) из компании Apple обнаружил вызов Sleep() в спинлоке функции TCMalloc сборщика мусора WebKit.

 -#if OS(WINDOWS)
-    Sleep(2);
-#else
-    struct timespec tm;
-    tm.tv_sec = 0;
-    tm.tv_nsec = 2000001;
-    nanosleep(&tm, NULL);
-#endif

После удаления Sleep производительность сборщика в определённых условиях выросла в 3,7 раза. Это наглядный пример, как одна маленькая оптимизация способна и уменьшить размер кода, и одновременно в несколько раз повысить производительность.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js