Jens Schmidt on Tue, 04 Jul 2017 07:46:54 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
gcopy_avma() is wasting stack memory compared to gcopy() |
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. ---- GEN stacktest(GEN x) { pari_sp av0 = avma; /* save stack pointer */ pari_printf("avma=%p\n", avma); gcopy(x); /* make copy of x with gcopy() */ pari_printf("avma=%p, gcopy size=%ld\n", avma, av0 - avma); pari_sp av1 = avma; /* save intermediate stack pointer */ gcopy_avma(x, &avma); /* make copy of x with gcopy_avma() */ pari_printf("avma=%p, gcopy_avma size=%ld\n", avma, av1 - avma); pari_puts("\nstack contents:\n"); dbg_gerepile(av0); /* display stack contents between av0 and avma */ avma = av0; /* garbage collection */ return gen_0; /* return 0 */ } ---- Checking numbers like Pi or 1/7 shows no difference: ---- gp > stacktest(Pi) avma=0x7f739f135f08 avma=0x7f739f135ee8, gcopy size=32 avma=0x7f739f135ec8, gcopy_avma size=32 stack contents: [0] 3.1415926535897932384626433832795028842: [4] 3.1415926535897932384626433832795028842: ---- gp > stacktest(1/7) avma=0x7f739f135eb8 avma=0x7f739f135e70, gcopy size=72 avma=0x7f739f135e28, gcopy_avma size=72 stack contents: [0] 7: [3] 1: [6] 1/7: 1 [3], 7 [0] [9] 7: [12] 1: [15] 1/7: 1 [12], 7 [9] ---- But when using empty variables in expressions like 'a' or 'sin(x)' there is a big difference: ---- gp > stacktest(a) avma=0x7f739f135f38 avma=0x7f739f135f00, gcopy size=56 avma=0x7f739f135eb8, gcopy_avma size=72 stack contents: [0] 1: [3] 0: [5] a: 0 [3], 1 [0] [9] 1: [12] a: gen_0, 1 [9] ---- There is a differene in size: 56 vs. 72 bytes = 16 bytes. Testing sin(x) yields a difference of 672 vs. 800 byte = 128 bytes LG - Jens