Warning: mkdir(): No space left on device in /var/www/tgoop/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/unsafecsharp/--): Failed to open stream: No such file or directory in /var/www/tgoop/post.php on line 50
Unity: Всё, что вы не знали о разработке@unsafecsharp P.45
UNSAFECSHARP Telegram 45
Немного про аллокации и кэш.

Самый простой пример аллокаций - это замыкание.
Тут остановимся подробнее. Где могут скрываться аллокации, например, в такой конструкции:
list.Where(x => x > 10).ToArray()
Очевидно, что при вызове ToArray будет создан массив. Больше никаких аллокаций в данном примере не будет. Давайте рассмотрим второй пример:

var a = 10;
list.Where(x => x > a).ToArray()

Тут к предыдущей аллокации добавляется еще замыкание с переменной a. Проблема в том, что с этим мы ничего поделать не можем.
Но давайте представим, что мы пишем свой замечательный Linq. Каким образом можно избежать аллокации? Нужно сделать просто передачу параметра:

public static void Where<TClosure, T>(this List<T> list, TClosure closure, System.Func<T, TClosure, bool> where) {
if (where.Invoke(list[i], closure) == false) ...
}

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

Аллокации при боксинге. Боксинг (boxing) - это фактически создание ValueType в куче. Это довольно затратный процесс сам по себе, но самое главное - это тот факт, что когда-нибудь GC об этом вам напомнит.
При обратном процессе (unboxing) этого не происходит.

Вообще аллокации в куче плохи тем, что они не очень cache-friedly. Но иногда нам нужно сделать аллокации. Представим ситуацию, когда мы аллоцируем массив с нодами, где у каждой ноды есть еще список нод:

var arr = new Node[1000];
for (int i = 0; i < arr.Length; ++i) {
arr[i] = new Node() {
nodes = new List<Node>(),
};
}

Обычно я встречал запись именно такую. Чем она плоха? Тем, что мы аллоцируем первую ноду, и сразу в ноде аллоцируем еще один объект (а может и несколько). Т.е. мало того, что куча в принципе не очень cache-friedly, так мы отказываемся от кэша совсем, создавая объекты таким образом. Как нужно было бы поступить?

var arr = new Node[1000];
for (int i = 0; i < arr.Length; ++i) {
arr[i] = new Node(); // Создаем ноды, чтобы GC постарался их разместить в памяти последовательно
}
for (int i = 0; i < arr.Length; ++i) {
arr[i].nodes = new List<Node>(); // Инициализируем данные каждой ноды
}

Таким образом, если мы не готовы писать cache-friedly код в целом, то хотя бы частично небольшими изменениями мы можем постараться помочь GC.

#gc #allocations #cache
👍25🔥9🕊1



tgoop.com/unsafecsharp/45
Create:
Last Update:

Немного про аллокации и кэш.

Самый простой пример аллокаций - это замыкание.
Тут остановимся подробнее. Где могут скрываться аллокации, например, в такой конструкции:
list.Where(x => x > 10).ToArray()
Очевидно, что при вызове ToArray будет создан массив. Больше никаких аллокаций в данном примере не будет. Давайте рассмотрим второй пример:


var a = 10;
list.Where(x => x > a).ToArray()

Тут к предыдущей аллокации добавляется еще замыкание с переменной a. Проблема в том, что с этим мы ничего поделать не можем.
Но давайте представим, что мы пишем свой замечательный Linq. Каким образом можно избежать аллокации? Нужно сделать просто передачу параметра:

public static void Where<TClosure, T>(this List<T> list, TClosure closure, System.Func<T, TClosure, bool> where) {
if (where.Invoke(list[i], closure) == false) ...
}

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

Аллокации при боксинге. Боксинг (boxing) - это фактически создание ValueType в куче. Это довольно затратный процесс сам по себе, но самое главное - это тот факт, что когда-нибудь GC об этом вам напомнит.
При обратном процессе (unboxing) этого не происходит.

Вообще аллокации в куче плохи тем, что они не очень cache-friedly. Но иногда нам нужно сделать аллокации. Представим ситуацию, когда мы аллоцируем массив с нодами, где у каждой ноды есть еще список нод:

var arr = new Node[1000];
for (int i = 0; i < arr.Length; ++i) {
arr[i] = new Node() {
nodes = new List<Node>(),
};
}

Обычно я встречал запись именно такую. Чем она плоха? Тем, что мы аллоцируем первую ноду, и сразу в ноде аллоцируем еще один объект (а может и несколько). Т.е. мало того, что куча в принципе не очень cache-friedly, так мы отказываемся от кэша совсем, создавая объекты таким образом. Как нужно было бы поступить?

var arr = new Node[1000];
for (int i = 0; i < arr.Length; ++i) {
arr[i] = new Node(); // Создаем ноды, чтобы GC постарался их разместить в памяти последовательно
}
for (int i = 0; i < arr.Length; ++i) {
arr[i].nodes = new List<Node>(); // Инициализируем данные каждой ноды
}

Таким образом, если мы не готовы писать cache-friedly код в целом, то хотя бы частично небольшими изменениями мы можем постараться помочь GC.

#gc #allocations #cache

BY Unity: Всё, что вы не знали о разработке


Share with your friend now:
tgoop.com/unsafecsharp/45

View MORE
Open in Telegram


Telegram News

Date: |

Ng Man-ho, a 27-year-old computer technician, was convicted last month of seven counts of incitement charges after he made use of the 100,000-member Chinese-language channel that he runs and manages to post "seditious messages," which had been shut down since August 2020. Hui said the messages, which included urging the disruption of airport operations, were attempts to incite followers to make use of poisonous, corrosive or flammable substances to vandalize police vehicles, and also called on others to make weapons to harm police. For crypto enthusiasts, there was the “gm” app, a self-described “meme app” which only allowed users to greet each other with “gm,” or “good morning,” a common acronym thrown around on Crypto Twitter and Discord. But the gm app was shut down back in September after a hacker reportedly gained access to user data. You can invite up to 200 people from your contacts to join your channel as the next step. Select the users you want to add and click “Invite.” You can skip this step altogether. Unlimited number of subscribers per channel
from us


Telegram Unity: Всё, что вы не знали о разработке
FROM American