Given the attached sample code. It tries to profile the difference between accessing a native mapping and accessing it through a class which is declared inline as much as possible. When I run it, I find that the native mapping is about twice as fast and the inlined amapping class. What would it take to make an amapping class less than a factor 1.2 slower than the native mapping?
Would being able to inherit from some kind of "_Builtin._mapping" class be of any use?
I ran the tests on Pike 8.1.
---------------------------------cut here-------------------- #!/usr/local/bin/pike
#define REPEAT 10000
class timeit { protected void create(string name, function(:void) fn) { int i,t1,t2; mixed e; t1 = gethrtime(); e = catch { for (i=REPEAT; i>0; i--) fn(); }; if (e) write("Skipped %s\n", name); else { t2 = gethrtime(); write("%f %s\n", (t2-t1)/(float)REPEAT, name); } } }
class amapping { private mapping values;
inline protected void create(mapping v) { values = v; }
inline private mixed `[](string key) { return values[key]; }
inline private mixed `->(string key) { return values[key]; }
inline private mixed `[]=(string key, mixed v) { return values[key] = v; }
inline private mixed `->=(string key, mixed v) { return values[key] = v; }
inline private Iterator _get_iterator() { return get_iterator(values); }
inline private array(string) _indices() { return indices(values); }
private string _sprintf(int type, void|mapping flags) { string res = UNDEFINED; switch (type) { case 'O': res = sprintf("%O", values); int indent; if (flags && (indent = flags->indent)) res = replace(res, "\n", "\n" + " " * indent); break; } return res; } }
int main(int argc, array(string) argv) { mapping m = ([ "abc":8, "acc":1, "adc":2, "aec":3, "afc":4, "agc":5, "ahc":6, "adc":2, "1dc":3, "3dc":2, "4dc":2, "5dc":8, "6dc":7, "7dc":2, "8dc":3, "rdc":2, ]); amapping am = amapping(m); timeit("mapping", lambda(){ int total = 0; foreach (indices(m);; string id) total += m[id]; return total; }); timeit("amapping", lambda(){ int total = 0; foreach (indices(m);; string id) total += am[id]; return total; }); return 0; } ---------------------------------cut here--------------------