Memoizálás

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. november 9-én felülvizsgált verziótól ; az ellenőrzéshez 1 szerkesztés szükséges .

Memoization (Cache) ( eng.  memoization from eng.  memory és eng.  optimization ) egy példa a gyorsítótár használatára szoftverfejlesztésben, programozásban, a függvények végrehajtásának eredményeinek elmentésére az újraszámítások elkerülése érdekében. Ez a számítógépes programok végrehajtásának felgyorsítására használt optimalizálási módszerek egyike . A függvény meghívása előtt ellenőrzi, hogy a függvényt meghívták-e korábban:

A memoization nem csak egy program felgyorsítására használható. Például keresztrekurzív felülről lefelé történő elemzésben használják egy általánosított felülről lefelé értelmező algoritmusban [1] .

Bár a gyorsítótárazáshoz kapcsolódik , a memoizálás az optimalizálás egy sajátos fajtája, amely különbözik a gyorsítótárazási módszerektől, például a puffereléstől és az oldalcserétől.

A logikai programozási nyelveken belül a memoizálást táblázatosításnak nevezik.

Használati példák

Az alábbi memoize() függvény a fogadott függvény minden egyes hívásának eredményét [kulcs:érték] néven tárolja.

// Olyan függvény, amely a const generKey = args => paraméterek alapján kulcsot generál ( args . map ( x => ` ${ x . toString () } : ${ typeof ( x ) } ` ). join ( '| ' ) / / Eredmény: "x1:szám|x2:szám|..." ); // Paraméterként egy függvényt vesz fel const memoize = fn => { const cache = {}; return (... args ) => { // Kulcsot generál az eredmény tárolására const key = generateKey ( args ); constval = gyorsítótár [ kulcs ] ; // Ellenőrzi, hogy van-e érték az adott kulcshoz, és visszaadja, ha létezik, ha ( val ) return val ; // Tárolja a függvényhívás eredményét const res = fn (... args ); gyorsítótár [ kulcs ] = res ; // Az eredményt adja vissza return res ; }; };

Ezzel elkerülhetjük a számítások újravégrehajtását, ha azokat már elvégeztük.

// Függvény, amely megkeresi az a-tól b-ig tartó számok összegét const sumSeq = ( a , b ) => { console . log ( 'Összeg kiszámítása' ); legyen r = 0 ; for ( legyen i = a ; i < b ; i ++ ) r += i ; return r ; }; // A sumSeq függvény memorizálása const mSumSeq = memoize ( sumSeq ); konzol . log ( 'Első hívás mSumSeq(2, 5)' ); konzol . log ( 'Érték: ' + mSumSeq ( 2 , 5 )); // "9"-et nyomtat a konzolkonzolra . log ( 'Második hívás mSumSeq(2, 5)' ); konzol . log ( 'A gyorsítótárból: ' + mSumSeq ( 2 , 5 )); // "9"-et nyomtat a konzolkonzolra . log ( 'Call mSumSeq(2, 6)' ); konzol . log ( 'Számított: ' + mSumSeq ( 2 , 6 )); // "14"-et nyomtat a konzolra

Az mSumSeq( 2, 5 ) függvény ismételt meghívásakor a program nem számolta újra az összeget, a [2:szám|5:szám] kulccsal ellenőrizte az érték meglétét a gyorsítótárban, és mivel már megvolt. létrehozva, és az első függvényhíváskor a 9-es értéket kapta, ez az érték a memoize() függvény val változójának lesz átadva, és argumentumként kerül vissza a console.log() fájlba.

Ez a példa a memoizálás legegyszerűbb alkalmazását mutatja be a programozásban, így előfordulhat, hogy a munka sebességében nem tapasztalható jelentős változás, azonban ez az optimalizálási módszer nagyban megkönnyítheti a processzor munkáját terhelt matematikai számításokkal.

Lásd még

Linkek

Kódpéldák a forrásból:

HowProgrammingWorks, Timur Shemsedinov - Github adattár .

Jegyzetek

  1. Norvig Péter. Automatikus memoizációs technikák alkalmazásokkal a kontextusmentes elemzéshez  // Számítógépes nyelvészet. - 1991. - T. 17 , 1. sz . - S. 91-98 .