| Ruud H.G. van Tol on Sat, 25 Apr 2026 13:52:54 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| mapisdefined(m,k,&v) vs. iferr(mapget(m,k),E,) |
v=0; mapisdefined(m, k, &v); mapput(~m, k, v+1) vs. mapput(~m, k, iferr( mapget(m, k), E, 0)+1)I recently changed some code to use the iferr() variant, to make it run significantly faster.
Yes, there was a stupid tight loop involved.
Random test:
? {
my(nn=10^5, w=100, m=Map());
for(i=1, nn
, my(k=random(w), v=[]);
mapisdefined(m, k, &v);
mapput(~m, k, concat(v, i))
);
#m
}
cpu time = 1,256 ms, real time = 1,260 ms.
% 100
? {
my(nn=10^5, w=100, m=Map());
for(i=1, nn
, my(k=random(w));
mapput(~m, k, concat(iferr(mapget(m,k),E,[]), i))
);
#m
}
cpu time = 871 ms, real time = 891 ms.
% 100
Maybe mapget() can grow a variant, with an extra parameter for an
expression to return in cases where the key doesn't exist.
mapput( ~m, k, concat( mapgetX(m, k, []), i) ) -- Ruud