Meta tags:
description= Tales of Raku guts hacking;
Headings (most frequently used words):
the, and, dispatch, in, what, moarvm, is, guards, next, of, raku, new, multiple, int, from, core, mechanism, with, my, faster, box, unbox, operations, results, happens, you, that, are, how, do, resumption, one, trivial, vs, bootstrap, so, steps, to, summary, recent, 6guts, recollections, summit, here, dispatcher, towards, general, taking, break, development, perl, wishes, for, 2019, speeding, up, object, creation, eliminating, unrequired, redesigning, rakudo, scalar, big, wins, caller, side, decontainerization, further, less, micro, things, smaller, profiler, output, there, any, bad, news, will, be, broken, thank, goodness, lot, semantics, everywhere, most, dispatches, boring, we, today, guard, types, goes, hole, custom, protos, two, become, non, preliminary, final, thoughts, why, does, matter, specialized, generalized, mechanisms, language, runtimes, op, dispatchers, building, on, capture, manipulation, done, far, future, opportunities, closing, partial, escape, analysis, related, optimizations, decreasing, startup, time, base, memory, use, improving, compilation, times, research, into, concurrency, safety, get, cro, its, release, comma, community, lots, improvements, features, speaking, conferences, workshops, etc, teaching, down, work, during, construction, slurpy, sadness, conditional, elimination, generating, simpler, code, an, off, by, just, cheap, representation, problems, changing, boxing, unboxing, specialization, about, looking, ahead, data, structure, redesign, later, optimization, spesh, plugins, posts, comments, archives, categories, meta,
Text of the page (most frequently used words):
the (1411), and (455), that (387), #dispatch (319), this (237), for (204), with (157), dispatcher (140), nqp (134), new (124), can (114), method (107), there (106), but (106), are (105), which (102), type (100), code (92), have (90), was (90), also (90), will (89), raku (87), into (86), boot (84), time (78), then (76), object (76), call (75), multi (73), some (72), not (72), guard (71), value (70), where (66), from (65), one (65), syscall (65), all (64), more (64), first (63), capture (62), work (58), scalar (56), when (56), use (53), mechanism (52), perl (52), has (52), arguments (52), set (49), things (49), argument (49), case (48), would (48), about (48), guards (48), program (48), moarvm (47), just (47), what (47), like (46), name (46), now (45), out (44), however (44), get (43), point (43), bit (43), multiple (42), since (42), only (41), resumption (41), way (40), next (40), them (40), being (39), result (39), thus (39), too (39), int (37), how (36), other (35), need (35), its (35), quite (34), they (34), those (34), were (34), these (33), str (33), candidate (33), arg (33), used (32), state (32), specializer (31), really (31), using (31), two (31), make (31), example (31), than (31), well (30), most (30), further (30), could (30), run (30), obj (30), resume (30), cache (29), here (28), doing (28), something (28), good (28), callsame (28), proto (28), rakudo (27), already (27), number (27), invoke (27), had (26), able (26), class (26), around (25), because (25), been (25), still (25), may (24), after (24), look (24), far (24), once (24), see (24), any (24), delegate (24), performance (23), much (23), through (23), same (23), calls (23), kind (23), big (23), while (23), before (23), constant (23), write (22), such (22), rather (22), operations (22), should (22), types (22), programs (22), improvement (21), know (21), away (21), means (21), runtime (21), posted (20), better (20), back (20), does (20), bytecode (20), might (20), even (20), less (20), optimizations (20), cost (20), list (20), faster (20), language (20), design (19), current (19), specialization (19), again (19), check (19), identity (19), function (19), sub (19), return (19), take (19), order (19), both (19), done (19), integer (19), benchmark (19), escape (18), implementation (18), cases (18), thing (18), you (18), many (18), common (18), specialized (18), small (18), callsite (18), init (18), candidates (18), end (17), analysis (17), perform (17), optimizer (17), container (17), instead (17), second (17), having (17), possible (17), each (17), level (17), working (17), box (17), expect (17), core (16), needed (16), single (16), assignment (16), path (16), making (16), want (16), don (16), register (16), compiler (16), methods (16), total (16), fallback (16), literal (16), operation (15), optimization (15), produce (15), optimize (15), few (15), various (15), without (15), memory (15), every (15), very (15), place (15), find (15), start (15), over (15), routine (15), machine (15), lot (15), always (15), say (15), going (15), track (15), meth (15), fac (15), create (14), hash (14), yet (14), descriptor (14), given (14), objects (14), callback (14), enough (14), made (14), jit (14), read (14), called (14), args (14), clauses (14), part (13), checks (13), post (13), special (13), semantics (13), inlining (13), probably (13), looking (13), pretty (13), features (13), target (13), actually (13), insert (13), per (13), resolved (13), drop (13), temporary (13), chars (13), taking (12), plugin (12), plugins (12), interesting (12), handling (12), vivification (12), nothing (12), attribute (12), handle (12), why (12), did (12), wasn (12), another (12), getting (12), got (12), bless (12), involved (12), loop (12), invocant (12), started (11), comments (11), uncategorized (11), september (11), october (11), june (11), 2012 (11), 2018 (11), along (11), array (11), inline (11), else (11), particular (11), containers (11), compiled (11), gets (11), eliminate (11), later (11), makes (11), works (11), inlined (11), least (11), itself (11), implemented (11), implement (11), instruction (11), fact (11), help (11), either (11), empty (11), today (11), role (11), results (11), 2011 (10), general (10), step (10), change (10), runs (10), changes (10), meaning (10), future (10), normal (10), non (10), slow (10), otherwise (10), full (10), version (10), under (10), values (10), turn (10), nice (10), closure (10), deal (10), didn (10), compilation (10), never (10), jnthnwrthngtn (10), boxing (10), compile (10), range (10), reads (10), great (10), couple (10), relatively (10), mean (10), self (10), count (10), startup (10), doesn (10), year (10), months (10), times (10), comma (10), release (10), cro (10), amount (10), test (10), trivial (10), july (9), april (9), 2013 (9), 2015 (9), 2016 (9), off (9), replacement (9), directly (9), nil (9), especially (9), ops (9), store (9), simple (9), different (9), kinds (9), build (9), day (9), ssa (9), let (9), statistics (9), currently (9), building (9), isn (9), question (9), opportunities (9), load (9), callee (9), during (9), buildall (9), anyway (9), support (9), rakuast (9), although (9), sure (9), chain (9), linked (9), dispatches (9), begin (9), january (8), 2017 (8), 2021 (8), continue (8), come (8), spesh (8), based (8), setting (8), calling (8), produces (8), course (8), original (8), realized (8), checking (8), efficient (8), bind (8), idea (8), allocate (8), significant (8), problem (8), their (8), ahead (8), properties (8), cheap (8), real (8), our (8), produced (8), missing (8), allocations (8), string (8), lots (8), thanks (8), instructions (8), duplicate (8), form (8), note (8), show (8), improvements (8), down (8), logging (8), little (8), 1_000_000 (8), years (8), initial (8), initialization (8), error (8), seen (8), hot (8), clause (8), tree (8), comment (7), august (7), 2019 (7), recent (7), development (7), soon (7), give (7), needs (7), include (7), inside (7), everything (7), bits (7), standard (7), smaller (7), running (7), etc (7), easy (7), short (7), frame (7), information (7), known (7), attributes (7), previously (7), terms (7), situation (7), talk (7), prove (7), powerful (7), fast (7), unbox (7), calculate (7), long (7), caller (7), interpreter (7), mov (7), process (7), plenty (7), though (7), keep (7), fairly (7), goes (7), stuff (7), providing (7), high (7), found (7), signature (7), matching (7), pun (7), decent (7), phase (7), next_method (7), track_state (7), defer (7), delegate_capture (7), speedup (7), 6guts (6), free (6), november (6), march (6), summit (6), implementing (6), related (6), auto (6), against (6), desc (6), bad (6), larger (6), size (6), meant (6), upon (6), wanted (6), invoked (6), exist (6), data (6), structure (6), entirely (6), allocation (6), reason (6), early (6), allow (6), provide (6), certainly (6), costs (6), exactly (6), uses (6), unboxing (6), resulting (6), consider (6), immutable (6), offset (6), turns (6), useful (6), certain (6), looks (6), put (6), written (6), matches (6), branch (6), reg (6), ready (6), attrinit (6), took (6), except (6), whole (6), longer (6), happens (6), product (6), applications (6), become (6), ways (6), above (6), until (6), dynamic (6), important (6), elements (6), costly (6), foo (6), record (6), outcome (6), start_type (6), deferralchain (6), follows (6), dispatchers (6), pass (6), reach (6), nominal (6), match (6), onlystar (6), custom (6), wordpress (5), com (5), log (5), account (5), 2010 (5), posts (5), immediately (5), dealing (5), tests (5), spend (5), steps (5), optimized (5), binds (5), constraint (5), assigned (5), often (5), analyze (5), applies (5), slightly (5), wrote (5), replace (5), easier (5), action (5), logic (5), considering (5), potentially (5), solution (5), static (5), hold (5), rid (5), inserted (5), win (5), benefit (5), taken (5), deoptimization (5), trying (5), immediate (5), parameters (5), math (5), producing (5), addition (5), simply (5), allocated (5), input (5), lower (5), collection (5), wrapper (5), simpler (5), higher (5), writing (5), elimination (5), mostly (5), deoptimize (5), wants (5), sslot (5), entry (5), table (5), points (5), chance (5), passing (5), lookup (5), chosen (5), findmethod (5), teaching (5), ended (5), side (5), folks (5), try (5), built (5), message (5), bunch (5), hope (5), details (5), mechanisms (5), obtain (5), captureposarg (5), elems (5), exhausted (5), add (5), walk (5), provides (5), graph (5), factor (5), val (5), temporaries (5), index (5), encounter (5), delegates (5), caching (5), complex (5), truncate (5), profile (5), welcome (5), 10_000_000 (5), scope (5), required (4), report (4), sign (4), meta (4), february (4), mechan (4), break (4), search (4), beyond (4), access (4), near (4), default (4), decont (4), what_nd (4), instance (4), eqaddr (4), istype (4), decontainerization (4), simplified (4), followed (4), speed (4), handled (4), takes (4), across (4), creation (4), including (4), slot (4), seemed (4), aren (4), variable (4), sense (4), variables (4), forth (4), lookups (4), piece (4), days (4), reached (4), holds (4), overall (4), presence (4), between (4), ideal (4), introduces (4), together (4), therefore (4), fall (4), last (4), integers (4), pointer (4), flag (4), yes (4), provided (4), examples (4), num (4), representation (4), collectable (4), native (4), indicates (4), involve (4), opaque (4), allows (4), speculative (4), eliminated (4), sp_guard (4), facts (4), guarded (4), address (4), ago (4), who (4), expected (4), deliver (4), named (4), worse (4), happening (4), own (4), turned (4), remaining (4), passed (4), constructs (4), plan (4), creates (4), aside (4), tried (4), shift (4), fun (4), forward (4), community (4), hard (4), parallel (4), think (4), bugs (4), large (4), base (4), fully (4), references (4), steering (4), council (4), finally (4), ship (4), likely (4), delegation (4), replaces (4), punned (4), initially (4), majority (4), wrap (4), situations (4), resumptions (4), starting (4), evaluate (4), zero (4), stack (4), matter (4), somewhat (4), purposes (4), gives (4), ran (4), derived (4), overhead (4), true (4), limited (4), cached (4), choose (4), right (4), disp (4), benchmarks (4), moment (4), event (4), recall (4), virtual (4), substr (4), pos (4), condition (4), modules (4), profiler (4), output (4), notion (4), buf (4), website (3), content (3), blog (3), december (3), 2014 (3), recollections (3), towards (3), grant (3), foundation (3), application (3), ecosystem (3), module (3), left (3), issue (3), selected (3), exact (3), effect (3), principle (3), wraps (3), decontrv (3), iterable (3), concrete (3), isconcrete (3), remember (3), emit (3), forms (3), happily (3), specialize (3), performing (3), whence (3), internal (3), term (3), afterwards (3), storage (3), roughly (3), lifetime (3), prior (3), looked (3), direction (3), usage (3), problems (3), local (3), lets (3), understand (3), analyses (3), lived (3), significantly (3), major (3), restricted (3), difference (3), tracking (3), quickly (3), routines (3), levels (3), stores (3), risk (3), generally (3), contrast (3), came (3), advantage (3), overflow (3), flags (3), summary (3), overflowed (3), opportunity (3), cpu (3), open (3), boxed (3), calculating (3), basic (3), decide (3), picked (3), limit (3), reliably (3), hit (3), impact (3), garbage (3), similar (3), determined (3), library (3), stored (3), writes (3), skip (3), nursery (3), trigger (3), unspecialized (3), almost (3), calculated (3), extremely (3), particularly (3), respectively (3), numbers (3), appears (3), upcoming (3), seeing (3), changing (3), model (3), operator (3), avoid (3), uint32 (3), containing (3), lexical (3), originally (3), indirect (3), save (3), get_spesh_slot (3), direct (3), eliminating (3), busy (3), maybe (3), debugging (3), involving (3), existskey (3), constants (3), slurpy (3), felt (3), buffer (3), parameter (3), waste (3), heavily (3), clearly (3), operators (3), went (3), keeping (3), recently (3), happen (3), parsing (3), parser (3), encouraging (3), increasingly (3), slower (3), workshop (3), prague (3), concurrent (3), wish (3), latter (3), tweaks (3), feel (3), founded (3), ide (3), http (3), apis (3), following (3), wins (3), pre (3), myself (3), included (3), parse (3), perhaps (3), registers (3), pieces (3), enjoyed (3), fireworks (3), thank (3), decade (3), challenging (3), journey (3), others (3), hacking (3), reliable (3), effort (3), area (3), guts (3), comes (3), clear (3), existing (3), obvious (3), feature (3), understands (3), earlier (3), progress (3), mro (3), appropriate (3), node (3), deals (3), imperative (3), third (3), rest (3), resolve (3), reporting (3), boring (3), qualified (3), contains (3), switch (3), efficiently (3), treat (3), final (3), encoding (3), testing (3), valid (3), fails (3), cot (3), previous (3), captures (3), suite (3), mode (3), twice (3), eventually (3), tend (3), bootstrap (3), teach (3), aimed (3), optimal (3), map (3), interpret (3), favor (3), hand (3), private (3), specific (3), decisions (3), straightforward (3), saw (3), decently (3), generalized (3), pick (3), subroutine (3), biggest (3), microbenchmarks (3), attention (3), attempt (3), keen (3), triggers (3), failure (3), complexity (3), arr (3), overview (3), approach (3), easily (3), micro (3), places (3), context (3), huge (3), lock (3), monitors (3), parent (3), child (3), architecture (3), asynchronous (3), children (3), nodes (3), attaching (3), attachment (3), placeholder (3), site (2), manage (2), view (2), subscribers (2), subscribe (2), feed (2), entries (2), 2020 (2), 2023 (2), peter (2), lund (2), older (2), hours (2), submit (2), share (2), meantime (2), enjoy (2), week (2), notable (2), feedback (2), tuning (2), executed (2), checked (2), vivify (2), item (2), recont (2), normally (2), speshguardtype (2), instances (2), speshguardconcrete (2), grab (2), speshguardgetattr (2), key (2), conditions (2), returning (2), greatly (2), applicable (2), optimizing (2), talked (2), alas (2), replacing (2), atomic (2), compare (2), swap (2), worth (2), perspective (2), closures (2), giving (2), saving (2), carrying (2), placing (2), remove (2), outer (2), attached (2), held (2), usually (2), travel (2), lies (2), within (2), solves (2), solve (2), indirection (2), contents (2), proofs (2), tells (2), casing (2), preventing (2), improving (2), roadmap (2), plays (2), despite (2), reasoning (2), implementations (2), accessor (2), late (2), initialize (2), deep (2), depending (2), source (2), copying (2), binding (2), attractive (2), decrease (2), distance (2), your (2), surprise (2), indirections (2), sake (2), subclassing (2), reducing (2), calculation (2), width (2), compiling (2), inputs (2), pattern (2), finding (2), familiar (2), fit (2), whether (2), reasons (2), reading (2), omitted (2), suffered (2), twist (2), specializing (2), falls (2), fits (2), indicating (2), emitted (2), arbitrary (2), precision (2), merge (2), uniform (2), tricks (2), mixed (2), assigning (2), barrier (2), p6opaque (2), usual (2), unless (2), wrapping (2), text (2), csv (2), coming (2), versions (2), property (2), tell (2), safe (2), statically (2), saves (2), leads (2), repeated (2), notice (2), assert (2), litui32 (2), ever (2), safely (2), lead (2), shortcoming (2), gathered (2), detail (2), retain (2), topic (2), execute (2), space (2), conditional (2), jump (2), false (2), predictor (2), charge (2), effectively (2), macro (2), idx (2), tmp1 (2), spesh_idx (2), tmp2 (2), jmp (2), handler (2), arg1 (2), exit (2), cheaply (2), gathering (2), interpreted (2), callees (2), showing (2), round (2), besides (2), optimistic (2), fixed (2), closer (2), winning (2), pickings (2), exists (2), sentinel (2), atkey (2), actual (2), primitive (2), resolution (2), comparison (2), polymorphic (2), overwhelmingly (2), figure (2), answer (2), cheat (2), odd (2), involves (2), job (2), equivalent (2), python (2), ruby (2), allocates (2), measurements (2), programming (2), nicer (2), package (2), builds (2), tomorrow (2), concurrency (2), riga (2), speaking (2), keynote (2), conference (2), focus (2), aspects (2), thankfully (2), offering (2), commercial (2), supporter (2), users (2), ongoing (2), bring (2), environment (2), projects (2), wouldn (2), specifying (2), web (2), flexible (2), revealed (2), contributions (2), contributors (2), aim (2), link (2), quietly (2), offer (2), mistakes (2), blocking (2), thousands (2), tasks (2), handful (2), threads (2), safety (2), described (2), developing (2), project (2), compiles (2), ideas (2), caches (2), speedups (2), allowing (2), escapes (2), best (2), learned (2), continuing (2), hoping (2), achieve (2), display (2), puts (2), fine (2), holding (2), everyone (2), elections (2), sees (2), architectural (2), glad (2), remains (2), feels (2), equally (2), assume (2), offers (2), attend (2), potential (2), discarded (2), abstractions (2), trial (2), suggested (2), via (2), tail (2), rewriting (2), roles (2), won (2), express (2), active (2), furthermore (2), migrated (2), glacial (2), received (2), semantic (2), theory (2), supported (2), somewhere (2), matters (2), shows (2), seems (2), stacked (2), callbacks (2), resuming (2), monomorphic (2), deferral (2), track_start_type (2), track_name (2), captureposarg_s (2), mro_unhidden (2), discard (2), elsif (2), track_method (2), attr (2), update (2), track_next (2), shall (2), leave (2), just_args (2), is_dispatcher (2), deferring (2), wrappers (2), shared (2), bindattr (2), ado (2), subset (2), stripped (2), inheritance (2), resumable (2), precisely (2), reconstruct (2), creating (2), story (2), shown (2), receives (2), decontainerized (2), find_method (2), elided (2), establish (2), mind (2), carry (2), duplicated (2), must (2), manipulation (2), counter (2), terribly (2), throughout (2), recorded (2), utility (2), incoming (2), gone (2), whenever (2), invocation (2), transform (2), glance (2), guess (2), tweak (2), location (2), extra (2), turning (2), passes (2), define (2), minimal (2), dead (2), whose (2), traditionally (2), whereby (2), alone (2), specified (2), fair (2), solved (2), reduce (2), met (2), mentioned (2), introduction (2), branches (2), interpretation (2), cased (2), sometype (2), liability (2), possibilities (2), beat (2), identified (2), elide (2), correctly (2), highly (2), tied (2), tight (2), everywhere (2), expressed (2), correct (2), subroutines (2), lexically (2), youtube (2), quantity (2), decision (2), basket (2), goodness (2), struggle (2), baseline (2), unoptimized (2), iterations (2), tweaked (2), happy (2), numeric (2), 100_000 (2), reflect (2), lost (2), ability (2), binder (2), trick (2), terrible (2), asks (2), select (2), happened (2), walking (2), track_kind (2), body (2), proceed (2), explained (2), arity (2), ambiguity (2), shape (2), rough (2), paths (2), desirable (2), news (2), narrowest (2), sum (2), automatically (2), captured (2), json (2), merged (2), callstack (2), invoking (2), opening (2), requests (2), changed (2), releases (2), regressions (2), force (2), poor (2), merging (2), reaching (2), afraid (2), profiles (2), agrammon (2), profiling (2), missed (2), sink (2), trivially (2), loads (2), closely (2), standing (2), measuring (2), apply (2), close (2), tighter (2), keys (2), stands (2), acquires (2), monitor (2), testmonitor (2), mon (2), figured (2), leaked (2), cannot (2), translate (2), couldn (2), thread (2), flattened (2), quick (2), discussions (2), helped (2), regex (2), engine (2), backtracking (2), inner (2), cloning (2), pod6 (2), grammar (2), attach (2), targets (2), quasiquoted (2), symbols (2), tales (2), email, loading, collapse, bar, subscriptions, reader, privacy, join, subscribed, categories, archives, релиз, компилятора, wendyga, brings, 200, reliability, vacation, largely, aid, hopefully, foundational, fallout, toaster, bottom, vivifying, assignments, viv, sequence, assign, removes, stays, speshreg, perl6, returned, isconcrete_nd, iscont, containerize, readonly, speshguardtypeobj, annotated, decontainerizing, whatever, explicit, downside, generate, became, registered, 6model, api, extops, rewrites, ast, refactor, desugars, implicated, net, possibility, indicate, achieving, workable, alternatives, cause, clever, cleared, element, ness, redesign, funnily, aiming, subject, bounded, incorporate, stand, differences, fetch, forgot, torture, frustration, allocating, modern, algorithms, throw, difficulties, trait, bound, lazy, iterates, unlike, referencing, shorter, bet, redesigning, generality, coping, mixins, intstr, subtraction, multiplication, task, wider, storing, newly, spot, operate, portable, detect, wonder, pointers, aligned, byte, boundary, lowest, endian, platforms, reinstated, repeatedly, extends, spat, fitting, outside, readers, wondered, twists, lowering, eases, generational, omit, jits, compactly, decompose, marked, boxes, natives, explicitly, floating, strings, natively, typed, opposite, mathematical, continues, renewal, focusing, composed, resulted, structures, leading, exploit, reduces, broader, afforded, weren, enables, behaves, adding, falling, fail, associated, flow, upheld, concretely, awkwardly, additions, wrong, inlinee, asserted, carried, represented, block, stable, harder, quantify, recreate, world, expects, dive, essence, forgo, successfully, constrains, simplicity, plus, rate, cur_frame, effective_spesh_slots, objectptr, endmacro, mvmint16, ins, operands, lit_i16, cmp, jne, deopt, arg2, deopt_offset, arg3, deopt_target, callp, mvm_spesh_deopt_one_direct, stated, analyzing, typically, spots, unrequired, stages, stage, sheepishly, increased, putting, linking, percent, null, curiously, pulling, accessing, existence, generating, hadn, folding, processing, swallow, miss, throwaway, observed, positive, moments, sadness, stating, buildplan, overridden, theoretically, constructing, ours, construction, allowed, none, ground, breaking, iteration, collected, upgrade, spends, executing, noting, operational, bread, butter, pleasing, speedy, raw, shortage, libraries, main, head, social, media, rounds, speeding, night, sleep, begins, alongside, wonderful, talking, occasional, pitching, organizers, interested, sensible, german, swiss, resist, attending, locally, praha, european, lovely, city, wander, food, six, angle, spoken, conferences, workshops, complete, former, updates, worked, wishlist, lengthy, asking, exciting, integrated, minimum, viable, shipped, daily, honestly, polishing, stability, deprecation, policy, conducting, security, review, server, templating, login, flows, ensuring, macos, windows, queue, protocols, robustness, patterns, timeout, retry, circuit, breaker, reverse, proxying, popular, choice, attracted, dozen, exploring, prototyping, obviously, catches, liable, occasionally, explode, weird, helpful, trouble, races, safer, improved, outstanding, juggled, according, demand, scalability, react, await, research, suspect, elsewhere, pipeline, dependency, trees, waiting, grammars, half, achieved, deserialize, nfas, decreasing, hear, generation, armed, cease, performed, delivering, hopes, center, stemming, partial, digging, spent, hopeful, evening, beautiful, skyline, midnight, 6pm, families, thoughtful, plans, dig, festive, wishes, submitted, resignation, personal, health, grounds, please, worry, month, sized, anxiety, fulfill, voted, fascinating, christmas, robust, performant, sharing, people, considerate, receiving, vote, participated, humbling, removing, greatest, fold, learning, light, tunnel, enumerable, tempting, fate, crushed, juggling, softer, whereas, four, approaches, influenced, closing, router, routing, signatures, construct, curry, prime, capabilities, assuming, handles, returns, backends, ideally, ported, jvm, play, truffle, invokedynamic, rip, outcomes, goal, steady, date, regression, master, uncovered, fixing, semantically, moving, minor, nextwith, callwith, discussed, impression, uniformity, overwhelming, incur
Text of the page (random words):
ulti method dispatch then both method dispatch and multiple dispatch will guard the type of the first argument but the duplication is eliminated so only one check is done that goes in the resumption hole coming up with good abstractions is difficult and therein lies much of the challenge of the new dispatch mechanism raku has quite a number of different dispatch like things however encoding all of them directly in the virtual machine leads to high complexity which makes building reliable optimizations or even reliable unoptimized implementations challenging thus the aim is to work out a comparatively small set of primitives that allow for dispatches to be explained to the virtual machine in such a way that it can deliver decent performance it s fairly clear that callsame is a kind of dispatch resumption but what about the custom proto case and the where clause case it turns out that these can both be neatly expressed in terms of dispatch resumption too the where clause case needing one small addition at the virtual machine level which in time is likely to be useful for other things too not only that but encoding these features in terms of dispatch resumption is also quite direct and thus should be efficient every trick we teach the specializer about doing better with dispatch resumptions can benefit all of the language features that are implemented using them too custom protos recall this example proto mean collection collection elems 0 nil here we want to run the body of the proto and then proceed to the chosen candidate at the point of the by contrast when we don t have a custom proto we d like to simply get on with calling the correct multi to achieve this i first moved the multi candidate selection logic from the raku multi dispatcher to the raku multi core dispatcher the raku multi dispatcher then checks if we have an onlystar proto one that does not need us to run it if so it delegates immediately to raku multi core if not it saves the arguments to the dispatch as the resumption initialization state and then calls the proto the proto s is compiled into a dispatch resumption the resumption then delegates to raku multi core or in code nqp dispatch boot syscall dispatcher register raku multi initial dispatch only setting up resumption if we need to invoke the proto capture my callee nqp captureposarg capture 0 my int onlystar nqp getattr_i callee routine onlystar if onlystar don t need to invoke the proto itself so just get on with the candidate dispatch nqp dispatch boot syscall dispatcher delegate raku multi core capture else set resume init args and run the proto nqp dispatch boot syscall dispatcher set resume init args capture nqp dispatch boot syscall dispatcher delegate raku invoke capture resumption means that we have reached the in the proto and so now should go ahead and do the dispatch make sure we only do this if we are signalled to that it s a resume for an onlystar resumption kind 5 capture my track_kind nqp dispatch boot syscall dispatcher track arg capture 0 nqp dispatch boot syscall dispatcher guard literal track_kind my int kind nqp captureposarg_i capture 0 if kind 5 nqp dispatch boot syscall dispatcher delegate raku multi core nqp dispatch boot syscall dispatcher get resume init args elsif nqp dispatch boot syscall dispatcher next resumption nqp dispatch boot syscall dispatcher delegate boot constant nqp dispatch boot syscall dispatcher insert arg literal obj capture 0 nil two become one deferring to the next candidate for example with callsame and trying the next candidate because a where clause failed look very similar both involve walking through a list of possible candidates there s some details but they have a great deal in common and it d be nice if that could be reflected in how multiple dispatch is implemented using the new dispatcher before that a slightly terrible detail about how things work in rakudo today when we have where clauses first the dispatcher does a trial bind where it asks the question would this signature bind to do this it has to evaluate all of the where clauses worse it has to use the slow path signature binder too which interprets the signature even though we can in many cases compile it if the candidate matches great we select it and then invoke it which runs the where clauses a second time as part of the compiled signature binding code there is nothing efficient about this at all except for it being by far more efficient on developer time which is why it happened that way anyway it goes without saying that i m rather keen to avoid this duplicate work and the slow path binder where possible as i re implement this using the new dispatcher and happily a small addition provides a solution there is an op assertparamcheck which any kind of parameter checking compiles into be it type checking where clause checking etc this triggers a call to a function that gets the arguments the thing we were trying to call and can then pick through them to produce an error message the trick is to provide a way to invoke a routine such that a bind failure instead of calling the error reporting function will leave the routine and then do a dispatch resumption this means we can turn failure to pass where clause checks into a dispatch resumption which will then walk to the next candidate and try it instead trivial vs non trivial this gets us most of the way to a solution but there s still the question of being memory and time efficient in the common case where there is no resumption and no where clauses i coined the term trivial multiple dispatch for this situation which makes the other situation non trivial in fact i even made a dispatcher called raku multi non trivial there are two ways we can end up there the initial attempt to find a matching candidate determines that we ll have to consider where clauses as soon as we see this is the case we go ahead and produce a full list of possible candidates that could match this is a linked list see my previous post for why the initial attempt to find a matching candidate finds one that can be picked based purely on argument count and nominal types we stop there instead of trying to build a full candidate list and run the matching candidate in the event that a callsame happens we end up in the trivial dispatch resumption handler which since this situation is now non trivial builds the full candidate list snips the first item off it because we already ran that and delegates to raku multi non trivial lost in this description is another significant improvement today when there are where clauses we entirely lose the ability to use the moarvm multiple dispatch cache but under the new dispatcher we store a type filtered list of candidates at the callsite and then cheap type guards are used to check it is valid to use preliminary results i did a few benchmarks to see how the new dispatch mechanism did with a couple of situations known to be sub optimal in rakudo today these numbers do not reflect what is possible because at the moment the specializer does not have much of an understanding of the new dispatcher rather they reflect the minimal improvement we can expect consider this benchmark using a multi with a where clause to recursively implement factorial multi fac n where n 1 1 multi fac n n fac n 1 for 100_000 fac 10 say now init now this needs some tweaks and to be run under an environment variable to use the new dispatcher these are temporary until such a time i switch rakudo over to using the new dispatcher by default use nqp multi fac n where n 1 1 multi fac n n nqp dispatch raku call fac n 1 for 100_000 nqp dispatch raku call fac 10 say now init now on my machine the first runs in 4 86s the second in 1 34s thus under the new dispatcher this runs in little over a quarter of the time it used to a quite significant improvement already a case involving callsame is also interesting to consider here it is without using the new dispatcher multi fallback any x a x multi fallback numeric x n callsame multi fallback real x r callsame multi fallback int x i callsame for 1_000_000 fallback 4 2i fallback 4 2 fallback 42 say now init now and with the temporary tweaks to use the new dispatcher use nqp multi fallback any x a x multi fallback numeric x n new disp callsame multi fallback real x r new disp callsame multi fallback int x i new disp callsame for 1_000_000 nqp dispatch raku call fallback 4 2i nqp dispatch raku call fallback 4 2 nqp dispatch raku call fallback 42 say now init now on my machine the first runs in 31 3s the second in 11 5s meaning that with the new dispatcher we manage it in a little over a third of the time that current rakudo does these are both quite encouraging but as previously mentioned a majority of multiple dispatches are of the trivial kind not using these features if i make the most common case worse on the way to making other things better that would be bad it s not yet possible to make a fair comparison of this trivial multiple dispatches already receive a lot of attention in the specializer and it doesn t yet optimize code using the new dispatcher well of note in an example like this multi m int multi m str for 1_000_000 m 1 m x say now init now inlining and other optimizations will turn this into an empty loop which is hard to beat there is one thing we can already do though run it with the specializer disabled the new dispatcher version looks like this use nqp multi m int multi m str for 1_000_000 nqp dispatch raku call m 1 nqp dispatch raku call m x say now init now the results are 0 463s and 0 332s respectively thus the baseline execution time before the specializer does its magic is less using the new general dispatch mechanism than it is using the special case multiple dispatch cache that we currently use i wasn t sure what to expect here before i did the measurement given we re going from a specialized mechanism that has been profiled and tweaked to a new general mechanism that hasn t received such attention i was quite ready to be doing a little bit worse initially and would have been happy with parity running in 70 of the time was a bigger improvement than i expected at this point i expect that once the specializer understands the new dispatch mechanism better it will be able to also turn the above into an empty loop however since more iterations can be done per optimization this should still show up as a win for the new dispatcher final thoughts with one relatively small addition the new dispatch mechanism is already handling most of the raku multiple dispatch semantics furthermore even without the specializer and jit really being able to make a good job of it some microbenchmarks already show a factor of 3x 4x improvement that s a pretty good starting point there s still a good bit to do before we ship a rakudo release using the new dispatcher however multiple dispatch was the biggest remaining threat to the design it s rather more involved than other kinds of dispatch and it was quite possible that an unexpected shortcoming could trigger another round of design work or reveal that the general mechanism was going to struggle to perform compared to the more specialized one in the baseline unoptimized case so far there s no indication of either of these and i m cautiously optimistic that the overall design is about right posted in uncategorized 2 comments towards a new general dispatch mechanism in moarvm posted on march 15 2021 by jnthnwrthngtn my goodness it appears i m writing my first raku internals blog post in over two years of course two years ago it wasn t even called raku anyway without further ado let s get on with this shared brainache what is dispatch i use dispatch to mean a process by which we take a set of arguments and end up with some action being taken based upon them some familiar examples include making a method call such as basket add product quantity we might traditionally call just product and qauntity the arguments but for my purposes all of basket the method name add product and quantity are arguments to the dispatch they are the things we need in order to make a decision about what we re going to do making a subroutine call such as uc youtube comment since raku sub calls are lexically resolved in this case the arguments to the dispatch are uc the result of looking up the subroutine and youtube comment calling a multiple dispatch subroutine or method where the number and types of the arguments are used in order to decide which of a set of candidates is to be invoked this process could be seen as taking place inside of one of the above two dispatches given we have both multiple dispatch subroutines and methods in raku at first glance perhaps the first two seem fairly easy and the third a bit more of a handful which is sort of true however raku has a number of other features that make dispatch rather more well interesting for example wrap allows us to wrap any routine sub or method the wrapper can then choose to defer to the original routine either with the original arguments or with new arguments when doing multiple dispatch we may write a proto routine that gets to choose when or even if the call to the appropriate candidate is made we can use routines like callsame in order to defer to the next candidate in the dispatch but what does that mean if we re in a multiple dispatch it would mean the next most applicable candidate if any if we re in a method dispatch then it means a method from a base class the same thing is used to implement going to the next wrapper or eventually to the originally wrapped routine too and these can be combined we can wrap a multi method meaning we can have 3 levels of things that all potentially contribute the next thing to call thanks to this dispatch at least in raku is not always something we do and produce an outcome but rather a process that we may be asked to continue with multiple times finally while the examples i ve written above can all quite clearly be seen as examples of dispatch a number of other common constructs in raku can be expressed as a kind of dispatch too assignment is one example the semantics of it depend on the target of the assignment and the value being assigned and thus we need to pick the correct semantics coercion is another example and return value type checking yet another why does dispatch matter dispatch is everywhere in our programs quietly tieing together the code that wants stuff done with the code that does stuff its ubiquity means it plays a significant role in program performance in the best case we can reduce the cost to zero in the worst case the cost of the dispatch is high enough to exceed that of the work done as a result of the dispatch to a first approximation when the runtime understands the dispatch the performance tends to be at least somewhat decent but when it doesn t there s a high chance of it being awful dispatches tend to involve an amount of work that can be cached often with some cheap guards to verif...
|