Bill Allombert on Tue, 04 Jul 2017 10:43:47 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: gcopy_avma() is wasting stack memory compared to gcopy() |
On Tue, Jul 04, 2017 at 08:11:54AM +0200, Karim Belabas wrote: > * Jens Schmidt [2017-07-04 07:47]: > > Hello PARI developer. > > > > PARI Library Guide (PDF) writes: "GEN gcopy_avma(GEN x, pari_sp *AVMA) > > return a copy of x as from gcopy, except that we pretend that initially > > avma is *AVMA, and that *AVMA is updated accordingly (so that the total > > size of x is the difference between the two successive values of *AVMA)." > > I noticed that gcopy_avma() needs more memory (~ 20%-30%) than gcopy() > > to create a copy of a GEN object if GEN is of non recursive type, e.g. > > t_POL or t_SER. Therefore I've written a shot test function to dissect > > the PARI stack. > > The difference is due to gen_0: gcopy is allowed to keep (or create) pointers > to "universal objects", which need not be copied, whereas gcopy_avma is > a low-level function that was used to serialize objects out of a PARI > session and thus makes a deep copy of everything. It makes a huge > difference for sparse structures. > > I am not sure a gcopy_avma with the above semantic [which has never been > documented] is useful anymore, it does not seem to be used in the PARI > sources any longer; it is present twice: in gclone (where it's > definitely not needed) and in the pthread interface (where I *believe* > at this point that it's not needed). I'll investigate. gcopy_avma is needed for pthread.c, but not with this semantic, since the threads share the universal constants, but not the same PARI stack. Cheers, Bill.