Размер глобала

Mr N
Дата: 20.09.2005 13:30:22
Как можно средствами COS узнать размер глобала
Maksim UM
Дата: 20.09.2005 14:19:32
Смотря какой размер...
Если просто данных, то можно пробежаться по глобалу и считать
размеры (медленно).
Или см. работу утилиты ^%GSIZE. Оттуда можно взять код.
Mr N
Дата: 21.09.2005 13:39:52
А где можно найти утилиту %GSIZE? В проводнике в областях %SYS и %CACHELIB в списке программ её нету.
LittleCat
Дата: 21.09.2005 15:27:52
Mr N
А где можно найти утилиту %GSIZE? В проводнике в областях %SYS и %CACHELIB в списке программ её нету.

А Вы попробуйте задать маску поиска *.obj
Mr N
Дата: 21.09.2005 16:16:53
LittleCat
Mr N
А где можно найти утилиту %GSIZE? В проводнике в областях %SYS и %CACHELIB в списке программ её нету.

А Вы попробуйте задать маску поиска *.obj

Хотелось бы посмотреть исходный код этой утилиты, но по поиску *.int или *.mac ничего не находится.
Maksim UM
Дата: 21.09.2005 16:49:38
При установке Cache нужно поставить галку - грузить
исходники системных утилит (неуверен что работает в демо версии).
Можно еще при распаковке дистрибутива найти исходники
(непомню в какой директории).
LittleCat
Дата: 21.09.2005 20:20:04
Maksim UM
(неуверен что работает в демо версии).

Демо-версия ничем не отличается от полноценной кроме возможностей многопользовательской работы, так что смело ставьте галку и изучайте исходные тексты системных утилит :-)
elakt
Дата: 22.09.2005 10:12:10
LittleCat

Демо-версия ничем не отличается от полноценной кроме возможностей многопользовательской работы

А разве там не урезаны некоторые вещи? Например, размер буфера и что-то еще?
VadimF
Дата: 22.09.2005 11:35:29
Многопользовательская версия и Cache' PC - отдельные дистрибутивы.
Для Cache' PC не нужен лицензионный ключ. Cache' PC не может использовать лицензионный ключ.

В демоверсии ограничены размеры буфера глобалов и программ.
Это негативно сказывается на производительности.
Данные и программы не кэшируются в памяти, а каждый раз запрашиваются с диска.

Соответственно, если нужно тестировать производительность Cache', нужно запрашивать многопользовательскую версию с временной лицензией в офисе InterSysystems.

Вадим
Mr N
Дата: 23.09.2005 12:07:31
Поставил версию 5.0.15, нашёл в ней исходники %GSIZE, в инсталяхе версии 5.0.5 почему-то не мог найти опцию установки исходников.

Из найденного кода получилась следующая функция, которая в качестве параметра получает имя глобала без знака "^" и возвращает размер глобала в байтах:

GSize(G)
S DIR = ""
If $zbitget($zversion(0),21) {
Set dirinfo=$zu(49,DIR)
Set bigdb=$Piece(dirinfo,",",21)
Set blksiz=$Piece(dirinfo,",",2)
} else {
Set bigdb=0
Set blksiz=2048
}
Set datasize=$Case(blksiz,2048:2036,:(blksiz-$zu(40,32,10)))
s (n,k,c)=0 ;n:bytes,k:blocks,c:contiguous blocks?
Set rc=$$GetGlobalPointers^%DM(DIR,G,,.b)
//If ('rc) Do ShowMessage(rc,$Get(IO,0)) Quit ""
o 63
f q:'b d q:$d(err) s p=b+1,b=$$GetLinkBlockFromViewBuffer^%DMREPAIR(bigdb),c=c+(p=b)
. v b s t=$$GetBlockTypeFromViewBuffer^%DMREPAIR(bigdb)
. i t-8,t-12 s err="?TOB: "_b_":"_t q ;unexpected type of block
. s n=n+$$GetOffsetFromViewBuffer^%DMREPAIR(bigdb),k=k+1 ;q:t=8 ;so much for normal data blocks
. Set n=n-$Case(bigdb,0:0,:$zu(40,32,10)) ;Adjust number for header bytes
. f i=1:1 s x=$v(i*2-1,-6) q:x="" d q:$d(err)
. . ;Next line covers all the long string types for both 2k and bigdb
. . s v=$v(i*2,-6) If $a(v)'=5,($a(v)'=$Case(bigdb,0:9,:7)),($a(v)'=3) Quit
. . s nb=$p(v,",",2),r=$p(v,",",3) ;nb: # of blocks,r:#bytes in last block
. . s n=n+((nb-1)*blksiz)+r,k=k+(nb-1)+''r
c 63
//q n_","_k_","_c_$g(err)

Set bytes = $fn(n,",")
Quit bytes