Linux использует COW , чтобы поддерживать низкое потребление памяти после разветвления, но способ, которым переменные Perl 5 работают в perl
, кажется, побеждает эту оптимизацию. Например, для переменной:
my $s = "1";
perl
действительно хранит:
SV = PV(0x100801068) at 0x1008272e8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
Когда вы используете эту строку в числовом контексте, она модифицирует C struct
, представляющий данные:
SV = PVIV(0x100821610) at 0x1008272e8
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
Сам указатель строки не изменился (он все еще 0x100201d50
), но теперь он находится в другом C struct
(PVIV
вместо PV
). Я не изменил значение вообще, но вдруг я плачу стоимость COW. Есть ли способ заблокировать представление perl
переменной Perl 5, чтобы сэкономить время (perl
не нужно преобразовывать "0"
в 0
второй раз), хак не повредит использованию моей памяти
Обратите внимание, что представленные выше представления были сгенерированы из этого кода:
perl -MDevel::Peek -e '$s = "1"; Dump $s; $s + 0; Dump $s'