On Thu, 2017-06-01 at 07:52 -0700, Eliot Miranda wrote:
Hi Jan,
On Jun 1, 2017, at 1:17 AM, Jan Vrany jan.vrany@fit.cvut.cz wrote:
Hi folks,
Having a Spur VM, I wonder how to measure heap allocations made by a process executing a particular block, from within the image. For example, let's have following block:
[ | a |
100 timesRepeat: [ a := Array new: 100 ] ].
When run, this block allocates - if I'm correct - some 100 * (<object header size> + 4*100) bytes.
Plus the block arg to timesRepeat:. And the size of an Array in 32- bits is
Sure, sure. The exact number is not important for me right now.
Note that:
- Ideally, I'd like to exclude allocations made by other threads
Then run at high priority.
Good point, thanks. I always forget about that.
but having allocations made by all threads would be OK too.
- Block can span multiple scavenges even oldspace collects.
- As shown in the example above, I need to take garbage into
an account.
How to best measure this?
What exactly do you want to measure?
I want to know how much given code allocates. For example that given piece of code in total allocated 2.5GB. Say.
There is no allocation count, as that would slow down allocation.
Fair enough.
Time taken to allocate would be derived by sending timeTiRun to the above and subtracting the time for a null loop to run, and the time taken in GC.
The time taken in GC is maintained by the vm. See vmParameterAt: and surrounding. If you open the About Squeak dialog in a Squeak image this is nicely displayed in the VM Stats tab (IIRC).
It is indeed. But in this case I'm not interested in time spent in GC :-)
Thanks, Jan