Как стать автором
Обновить
-3
0

Пользователь

Отправить сообщение

Большинство из тех, кто знает про большое О, почему-то не понимает, что оно имеет смысл, когда N стремится в бесконечность. В реальности же N=100, или даже 100k, от бесконечности сильно отличаются, и часто всё решают константы, а не O().

Закольцованный буфер — ещё ладно; время потрачено, но он хотя бы работает. А на связном списке проще секунду просрать, чем 0.0001 выиграть.

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

Весь код, не рассчитанный на работу в современных условиях, был очевидно написан давно. Вполне естественно к нему возвращаться и поправлять под новые требования. Ты просто правишь в том месте, где начало тормозить, и всё, а не переписываешь механически весь LINQ везде на циклы и т.п.


Ещё бывает, что потенциально медленный код до этого "спустя годы" не доживает — видоизменяется или заменяется другим. Во время написания он был нормальным и с работой справлялся. А про то, что сейчас он был бы медленным, ты даже не узнаешь. Узнаешь только про тот код, который дожил.


Оптимизировать что угодно можно до бесконечности, поэтому нужно иметь для себя какой-то ориентир, чтобы глядя на который можно было сказать, всё, хватит, код уже достаточно быстр, не надо больше тратить время. Часто когда что-то пишешь с нуля, такого ориентира либо нет (ещё нет), либо пока не напишешь значительную часть кода, не можешь сравнивать. Поэтому сначала пишешь быстро, просто и понятно; и уже потом, когда появляется представление о фактической производительности, об узких местах, начинаешь оптимизировать там, где в этом есть смысл.

Интересно почему Интеловские процы дорожают?

Деньги очень нужны (с)

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

https://android-example.ru/useful-articles/kak-ispolzovat-funktsiyu-prodolzhit-na-pk-v-windows-10-s-iphone-ili-android-telefonom/


Можно отправить ссылку на ПК в виде уведомления/напоминания, а можно отправить сразу в браузер. От браузера на телефоне не зависит, на ПК ссылка вроде открывается принудительно в Edge, но не уверен, так как и так им пользуюсь по умолчанию.

Отображаемое имя пользователя всегда можно поменять, а путь к папке с профилем этого пользователя ― это раз и навсегда. Я регулярно лажу во всякие AppData/..., поэтому имя папки с профилем постоянно маячит перед глазами.

А мне нравится OneDrive, и что со смартфона можно статью, которую начал читать в троллейбусе, перекинуть на домашний ПК. Ты за него сел ― а она уже открыта.


ПК — это инструмент, а не средство связи, и On-Line для него, скорее, опция, а не нормальное состояние

У кого это не нормальное состояние, у тех проблем с запросом онлайн-учётки не возникает.

Я делаю офлайн и потом сразу к нему привязываю онлайн по той единственной причине, что в этом случае папка с профилем пользователя будет называться точно по первоначальному имени пользователя. Если сразу вводить онлайн-учётку, то тогда Windows назовёт папку как посчитает нужным. Сейчас, кажется обрезает до 5 букв.

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

Математика действительно периодически требуется, в геймдеве так вообще регулярно, но в ней нет ничего такого, что требовало бы 5 лет.

Compiler Explorer ― https://godbolt.org/


Потыкал в разные компиляторы. Все, кого попробовал, при использовании VLA мутили что-то с указателем вершины стека.


В принципе, одного примера C# достаточно, чтобы закрыть этот вопрос.

VLA (variable length array) входит в C99 как обязательная фича, в C11 как опциональная. Gcc, icc, clang её понимают, msvc игнорирует.


void Foo(int size)
{
    char array[size];
    // ...
}

В C# фича была с рождения:


unsafe void Foo(int size)
{
    byte* p = stackalloc byte[size];
    // ...
}

С версии 7.2 unsafe не требуется:


void Foo(int size)
{
    Span<byte> span = stackalloc byte[size];
    // ...
}

В комментариях к оригинальной статье примерно те же замечания. Правда ещё вспомнили про регистры: работа с переменными, которые теоретически должны быть расположены на стеке, быстрее не только из-за кешей процессора, но и потому что с большой вероятностью этих переменных в стеке вообще нет — они рождаются, изменяются и умирают в регистрах процессора без какого-либо обращения к памяти.

Про скорость выделения и освобождения там дальше свой отдельный пункт про стековые кадры.

Стек используется для статичного выделения памяти.

Если "статичный" в том смысле, что один раз выделил и потом только пользуешься, то нет — если функция вызывается 100 раз, то 100 раз на стеке будет отводиться место под её локальные данные.


Если "статичный" в том смысле, что размер выделяемого места известен на этапе компиляции, то тоже необязательно. C/C++/C#, например, позволяют в рантайме выделять на стеке области произвольного размера, лишь бы хватало свободного места.


Он организован по принципу «последним пришёл — первым вышел» (LIFO). Можно представить стек как стопку книг — разрешено взаимодействовать только с самой верхней книгой: прочитать её или положить на неё новую.

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


благодаря упомянутому принципу, стек позволяет очень быстро выполнять операции с данными — все манипуляции производятся с «верхней книгой в стопке». Книга добавляется в самый верх, если нужно сохранить данные, либо берётся сверху, если данные требуется прочитать;

Сам по себе принцип LIFO на скорость не влияет. Если имелось в виду, что благодаря этому принципу у данных на вершине стека больше шансов находиться в кешах процессора и поэтому доступ к ним обычно быстрее, то ладно. Правда, если у какого-то микропроцессора кешей нет, то всё равно что там: LIFO, FIFO или что-то ещё. Хотя это либо древность, либо экзотика.


управление стековой памятью простое и прямолинейное; оно выполняется операционной системой;

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

Из того, что мы не имеем в .NET явно — это структура безопасности с атрибутами безопасности и размер стэка.

Размер стека задаётся в параметрах конструктора потока.

Microsoft Edge — как изменить всё, ничего не меняя.

Надеюсь, IE будет жить ещё долго, потому что до хрена оборудования для видеонаблюдения, у которого интерфейс на ActiveX.

Десяток психотипов, которым никто строго не соответствует.

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность