
Алексей
17.05.2017
15:02:16
вот если вы в некоторую долговременную коллекцию складываете объекты, которые потом не будут никогда использоваться в коде, тогда это утечка

Никита
17.05.2017
15:02:19
Вот на эту.
@Fl0pZz Я говорил не столько об утечках (потому что утечек в явном виде таки нету, и определение утечки не такое, как выше дали), а о вообще проблемах с памятью.
Вот пример:
const count = 100;
const length = 1e7;
const storage = [];
for (let i = 0; i < count; i++) {
console.log(`Strings: ${i} | Ops: ${i * length / 1e6} million | RSS: ${process.memoryUsage().rss / 1e6} MB`);
let part = '';
for (let j = 0; j < length; j++) {
part += 'a';
}
storage.push(part);
}
Скажи, не запуская, какое будет отношение количества операций к занимаемой памяти?

Rafael
17.05.2017
15:03:27

Google

Никита
17.05.2017
15:03:44
Там операция — это добавление одного символа.
Внутри второго цикла.

Rafael
17.05.2017
15:04:16
а памяти: 1e7^2/2 нужно же

Никита
17.05.2017
15:04:42
Да, операций столько. Так сколько памяти в байтах на одну уйдёт?
Вай?

Rafael
17.05.2017
15:04:58
а еще и на 100 умножить надо

Сергей
17.05.2017
15:05:01
конкатенация строки рождает ещё одну строку)

Никита
17.05.2017
15:05:04
> 1e7^2/2
ненене, откуда ты это вообще взял?
откуда квадрат?

Сергей
17.05.2017
15:05:12
а вот когда освободится старая я хз

Rafael
17.05.2017
15:05:14

Google

Сергей
17.05.2017
15:05:48

Rafael
17.05.2017
15:05:57

Никита
17.05.2017
15:06:23

Rafael
17.05.2017
15:06:32

Никита
17.05.2017
15:06:55
> строчки длинной 1e7/2
у тебя вот тут ошибка

Сергей
17.05.2017
15:07:05
длина строки растет с каждой итерацией же

Никита
17.05.2017
15:07:12
Нет. она фиксирована
Во внутреннем представлении этих строк

Сергей
17.05.2017
15:07:34

Rafael
17.05.2017
15:07:41

Никита
17.05.2017
15:07:45
там пул строк же, ну
со ссылками

Rafael
17.05.2017
15:07:50
ты че??
нет конечно

Никита
17.05.2017
15:08:11
a0 = 'a'
a1 = a0 + 'a'
a2 = a1 + 'a'
a3 = a2 + 'a'
Растёт пул строк

Rafael
17.05.2017
15:08:21
ты создаешь строку - выделяется память впритык, конкатинируешь - выделяешь память под новую строку
поэтому в памяти у тебя буду сконкаченные строки

Google

Сергей
17.05.2017
15:08:53
пошел я читать как устроены строки в в8
чет вы договориться не можете

Никита
17.05.2017
15:09:00
Ты путаешь поведение для пользователя и внутреннее представление

KlonD90
17.05.2017
15:09:39
а слайсы лучше не делать в такой истории?

Rafael
17.05.2017
15:09:48
нихера
че эт нихера? т.е ты утвреджаешь. что во внутреннем представлении строкча это массив?
массив атомарных строк?

Никита
17.05.2017
15:10:15
Не совсем массив, но примерно да.
Если ты сконкатишь строку в 10 метров со строкой в 10 метров, у тебя не сожрётся 20 метров

Rafael
17.05.2017
15:10:42
никто не будет для строки это делать

Никита
17.05.2017
15:10:58
Потести.

Rafael
17.05.2017
15:11:05

Никита
17.05.2017
15:11:10
По памяти же.

Сергей
17.05.2017
15:11:12

Rafael
17.05.2017
15:11:40

Никита
17.05.2017
15:12:08
const a = Buffer.alloc(10e6).toString();
console.log(`RSS: ${process.memoryUsage().rss / 1e6} MB`);
const b = a + a;
console.log(`RSS: ${process.memoryUsage().rss / 1e6} MB`);
Вперёд.

Rafael
17.05.2017
15:12:25
т.е у строки, которая по сути есть непрерывный кусок памяти, для быстрого обращения к i-му элементу, ты предлагаешь делать связным массивом?

Vladimir
17.05.2017
15:12:39
У строк много представлений

Google

Vladimir
17.05.2017
15:12:47
В v8

Rafael
17.05.2017
15:13:22

Никита
17.05.2017
15:13:22
Да, но если делать конкатенации — мы натыкаемся именно на то, о котором я говорю.

Сергей
17.05.2017
15:13:29
как это работает...

Rafael
17.05.2017
15:13:45
и потом скажи сколько памяти он будет занимать после этого

Сергей
17.05.2017
15:13:57

Никита
17.05.2017
15:14:32
Но до него она хранится в памяти списком.

Admin
ERROR: S client not available

Сергей
17.05.2017
15:15:22
лол

KlonD90
17.05.2017
15:15:38
вывод лол
давайте

Сергей
17.05.2017
15:15:41

Никита
17.05.2017
15:15:41
Так вот, я говорил о том, что если строить строки посимвольной конкатенацией, то эти списки сожрут много памяти, больше, чем сожрала бы обычная такая строка или массив символов.

Rafael
17.05.2017
15:16:12
сколько памяти было до создания строки?

Сергей
17.05.2017
15:16:32

Rafael
17.05.2017
15:16:37

Никита
17.05.2017
15:16:59

Google

Rafael
17.05.2017
15:17:00

Никита
17.05.2017
15:17:12
Я видел как посимвольная конкатенация просто убивала память напрочь.

Сергей
17.05.2017
15:17:13

Никита
17.05.2017
15:17:38
Ну да, всё правильно.

Сергей
17.05.2017
15:17:59
как-то дохера для 10МБ строки

Rafael
17.05.2017
15:18:06
у тебя память под a выделется только в момент рандумакссеса

Никита
17.05.2017
15:19:08

Rafael
17.05.2017
15:19:17

Никита
17.05.2017
15:19:53
Это не jit.

Сергей
17.05.2017
15:19:56

Никита
17.05.2017
15:20:44
function gimme() {
const a = Buffer.alloc(20e6).toString();
console.log(`RSS: ${process.memoryUsage().rss / 1e6} MB`);
return a + a;
}
const map = new Map();
map.set('x', gimme());
console.log(map.get('x').length);
console.log(`RSS: ${process.memoryUsage().rss / 1e6} MB`);
Вы утверждаете, что жит достаточно умный, чтобы отсюда убрать мап и не хранить строку вообще?
Тут дело в представлении строки же, ну.
У строк много представлений

Rafael
17.05.2017
15:21:41

Сергей
17.05.2017
15:23:01

Rafael
17.05.2017
15:23:15
тут видно как сборщик работает

Никита
17.05.2017
15:23:55
Каждая итерация выделяет 20 метров

Сергей
17.05.2017
15:24:01

Rafael
17.05.2017
15:24:02
потому что у тебя ключик один и тот же