2015-02-24 6 views
2

Хочет сделать некоторое профилирование на скрипте R3 и проверял команду статистики. Но что означают эти данные? Как его использовать для мониторинга использования памяти?Как интерпретировать статистику/показать в Rebol 3

>> stats/show 
Series Memory Info: 
    node size = 16 
    series size = 20 
     5 segs = 409640 bytes - headers 
    4888 blks = 812448 bytes - blocks 
    1511 strs = 86096 bytes - byte strings 
     2 unis = 86016 bytes - unicode strings 
     4 odds = 39216 bytes - odd series 
    6405 used = 1023776 bytes - total used 
     0 free/ 14075 bytes - free headers/node-space 

Pool[ 0] 8B 202/ 3328: 256 (6%) 13 segs, 26728 total 
Pool[ 1] 16B 178/ 512: 256 (34%) 2 segs, 8208 total 
Pool[ 2] 32B 954/ 2560: 512 (37%) 5 segs, 81960 total 
... 
Pool[26] 64B  0/ 0: 128 (0%) 0 segs,  0 total 
Pools used 654212 of 1906200 (34%) 
System pool used 497664 
== 1023776 

ответ

3

Он отображает информацию управления внутренней памятью, не уверен, насколько полезной она будет для скрипта.

В любом случае, приведены некоторые пояснения о пулах памяти.

Большинство бассейнов для серии (для GOB! S есть специальный пул для GOB! S, а некоторые другие, если вы смотрите на исходный код Atronix), чтобы сделать его простым, я сосредоточусь на пулах серий здесь.

Внутренне, серия имеет заголовок и его данные, которые являются куском смежной памяти. Заголовок имеет ширину и длину информации о серии. Данные содержат фактическое содержание серии. В R3 Series широко используется для реализации блока !, port !, string !, object !, и т. Д. Таким образом, управление памятью в R3 почти управляет (распределяет и уничтожает). Из-за разницы в ширине и длине серий, пулы внедряются для уменьшения фрагментации.

Когда требуется новая серия, заголовок выделяется в специальном пуле, а для его данных выбирается другой пул. Выбирается пул, ширина которого закрыта до размера серии. Например. блок с 3 элементами, вероятно, будет выделен в пуле с шириной 128 байтов (в 32-битных системах блок представляет собой серию с 4 (3 + 1 terminater) элементами). Поскольку пул может увеличиваться по мере запуска программы, он реализуется как список сегментов. Новые сегменты будут выделены и добавлены в список по мере необходимости (но он никогда не будет возвращен в систему).

Другой специальный пул - это системный пул, который выбирается, когда требуется большая память. R3 фактически не управляет этим пулом, кроме сбора некоторых статистических данных.

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

+0

Благодарим за подробные разъяснения. На самом деле, моя цель состояла в том, чтобы проверить, сколько памяти было использовано реализацией и сравнить с другой. С командой статистики это кажется довольно трудным для достижения, поскольку это основанная на статистике. – GregP

1

Если вы используете stats без уточнений, вы можете увидеть фактическое использование памяти. Поэтому, сравнивая использование памяти до и после ваших реализаций, вы можете видеть, какая из них использует меньше памяти.

>> stats 
== 1129824 

>> s: make string! 1024 
== "" 

>> stats 
== 1132064 
+0

Это может дать вам приблизительную идею, но далеко не точную: 1) она только подсчитывает серию, что означает, что память, занятая голами, игнорируется; 2) он подсчитывает общее пространство ряда, даже если оно частично используется. См. NATIVE (статистика) в core/n-system.c и Inspect_Series в core/m-pools.c –

 Смежные вопросы

  • Нет связанных вопросов^_^