Mathieu Bouchard wrote:
I wanted to know what's the amount of RAM used up by a .dll file once loaded in RAM. I ask because I know that in Linux, the amount of RAM taken by a .so file once loaded in RAM is more than the length of the file due both to paging issues and to "fixup" issues (basically the table used for dlsym() which is used for relocating pointers considering that RAM positions can't be hardcoded in a .so)
From a test I just did on WinXP: ctrl-alt-delete, select processes, launch pd:
startup pd 0.39 test 7 with several libs: 8,940K create new patcher: 8,948K -> +8K put object: 8,960K -> +12K name it helloworld: 9,180K -> +220K (this helloworld.dll is 6K on disk) put object: 9,180K name it helloworld: 9,180K put bang: 9,184K -> + 4K connect it to a helloworld: 9,184K put bang: 9,184K connect it to a helloworld: 9,184K remove everything and then close the patcher: 9,184K
It looks like the smallest blocks allocated are 4K. I wonder why helloworld takes 220k. It was linked against pd.lib and kernel32.lib. My pd.lib is 85K on disk, kernel32.lib is 190K.
Second test: startup pd 0.39 test 7 with several libs: 8,916K (This time pd starts with less memory) create new patcher: 8,924K -> +8K put object: 8,936K -> +12K name it expr $1 + 1: 9,140K -> +204K (expr.dll is 152K on disk) put object: 9,140K name it expr $1 + 1: 9,140K remove everything and then close the patcher: 9,140K
Martin
============================================================================================ This is the code of helloworld: #define MSW #include "m_pd.h"
static t_class *helloworld_class;
typedef struct helloworld { t_object x_obj; } t_helloworld;
void helloworld_bang(t_helloworld *x); __declspec(dllexport) void helloworld_setup(void); void *helloworld_new(void);
void helloworld_bang(t_helloworld *x) { post("Hello World :0"); }
__declspec(dllexport) void helloworld_setup(void) { helloworld_class = class_new(gensym("helloworld"), (t_newmethod)helloworld_new, 0, sizeof(t_helloworld), CLASS_DEFAULT, 0); class_addbang(helloworld_class, helloworld_bang); }
void *helloworld_new(void) { t_helloworld *x = (t_helloworld *)pd_new(helloworld_class); return (void *)x; }