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.
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 konzolraAz 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.
Kódpéldák a forrásból:
HowProgrammingWorks, Timur Shemsedinov - Github adattár .