String internálás - String interning

Számítástechnika, húr interning egy módszer tárolására csak egy példányát minden egyes, húr érték, amelyet meg kell megváltoztathatatlan . A karakterláncok beillesztése bizonyos karakterlánc-feldolgozási feladatokat idő- vagy helytakarékosabbá tesz, és több időt igényel a karakterlánc létrehozásakor vagy internálásakor. A különböző értékeket egy karakterlánc -internettár tárolja .

Mindegyik karakterlánc egyetlen példányát gyakornoknak hívják, és általában a karakterlánc -módszerrel keresik, például a String.intern () Java -ban . A Java összes fordítási idejű állandó karakterlánca automatikusan internálódik ezzel a módszerrel.

A karakterláncok internálását néhány modern objektumorientált programozási nyelv támogatja , beleértve a Java, Python , PHP (5.4 óta), Lua , Ruby (szimbólumaival), Julia és .NET nyelveket . A Lisp , a Scheme és a Smalltalk olyan nyelvek közé tartozik, amelyek szimbólumtípusa alapvetően internált karakterlánc. A New Jersey -i Standard ML könyvtára egy olyan atomtípust tartalmaz , amely ugyanezt teszi. Az Objective-C szelektorok, amelyeket főként metódusnevekként használnak, internált karakterláncok.

A karakterláncokon kívül más objektumok is internálhatók. Például, a Java, amikor a primitív értékek bekereteztük egy átalakító objektum , bizonyos értékeket (bármely boolean, bármilyen byte, olyan char0-127, és bármely shortvagy intközötti -128 és 127) vannak internálták, és bármely két boksz konverziót az egyik ilyen az értékek garantáltan ugyanazt az objektumot eredményezik.

Történelem

Lisp bevezette szimbólumai számára az internált húrok fogalmát . A történelem során a karakterlánc -intern -készletként használt adatstruktúrát oblistnek (amikor hivatkozott listaként valósították meg) vagy obarray -nek (tömbként) nevezték.

A modern lisp nyelvjárások jellemzően megkülönböztetik a szimbólumokat a húroktól; adott karakterlánc internálása egy meglévő szimbólumot ad vissza, vagy létrehoz egy újat, amelynek neve ez a karakterlánc. A szimbólumok gyakran olyan további tulajdonságokkal is rendelkeznek, amelyekkel a karakterláncok nem rendelkeznek (például a kapcsolódó értékek tárolása vagy a névközök): a megkülönböztetés akkor is hasznos, ha nem kívánjuk véletlenül összehasonlítani az internált karakterláncot egy nem feltétlenül internált karakterlánccal, ami időszakos meghibásodásokhoz vezethet. használati minták.

Motiváció

A karakterlánc -internálás felgyorsítja a karakterlánc -összehasonlításokat, amelyek néha teljesítmény -szűk keresztmetszetet jelentenek olyan alkalmazásokban (például fordítók és dinamikus programozási nyelvek ), amelyek nagymértékben támaszkodnak a karakterlánc -kulcsokkal rendelkező asszociatív tömbökre az objektum attribútumainak és módszereinek megkereséséhez. Interning nélkül két külön karakterlánc összehasonlítása magában foglalhatja mindkettő minden karakterének vizsgálatát. Ez több okból is lassú: eredendően O (n) a húrok hosszában; jellemzően több memóriarégióból származó olvasást igényel , ami időbe telik; és az olvasások kitöltik a processzor gyorsítótárát, vagyis kevesebb gyorsítótár áll rendelkezésre más igényekhez. Az internált karakterláncokkal az egyszerű gyakornoki művelet után elegendő egy egyszerű tárgyazonossági teszt ; ez általában mutatóegyenlőségi tesztként valósul meg, általában csak egyetlen gépi utasítás, memóriahivatkozás nélkül.

A karakterlánc -internálás csökkenti a memóriahasználatot is, ha sok példány van azonos karakterlánc -értékkel; például hálózatról vagy tárolóról olvasható . Az ilyen karakterláncok tartalmazhatnak mágikus számokat vagy hálózati protokoll információkat. Például az XML -elemzők a memória megtakarítása érdekében internálhatják a címkék és attribútumok nevét. Az objektumok hálózati átvitele a Java RMI szerializációs objektumfolyamokon keresztül hatékonyabban tudja áthelyezni a karakterláncokat, mivel a String objektum fogantyúját a duplikált objektumok helyett használják a sorozatosítás során.

Problémák

Többszálú

A hátrányok egyik forrása, hogy a húros internálás problémás lehet, ha többszálúsággal keverik . Sok rendszerben a karakterlánc -gyakornokoknak globálisnak kell lenniük a címtér minden szálán (vagy minden olyan kontextusban, amely mutatókat megoszthat), így a gyakornokok globális erőforrások, amelyeket szinkronizálni kell a biztonságos egyidejű hozzáférés érdekében. Míg ez csak a karakterláncok létrehozását érinti (ahol a belső készletet ellenőrizni kell és szükség esetén módosítani kell), és kétszer ellenőrzött zárolást lehet használni olyan platformokon, ahol ez biztonságos optimalizálás, a kölcsönös kizárás szükségessége a belső készlet módosításakor költséges lehet .

A versengést az is csökkentheti, ha a karakterlánc -teret több medencére osztja szét, amelyek egymástól függetlenül szinkronizálhatók.

A nem használt internált karakterláncok visszaszerzése

Az internált karakterláncok sok megvalósítása nem próbálja meg visszaállítani (manuálisan vagy más módon) a már nem használt karakterláncokat. Azoknál az alkalmazásoknál, ahol az internált karakterláncok száma kicsi vagy rögzített, vagy amelyek rövid életűek, a rendszer erőforrásainak elvesztése tűrhető lehet. De azoknál a hosszú ideig működő rendszereknél, ahol futásidőben nagyszámú karakterlánc-gyakornok jön létre, felmerülhet a fel nem használt gyakornokok visszaszerzésének igénye. Ezt a feladatot egy szemétgyűjtő is tudja kezelni , bár ahhoz, hogy ez megfelelően működjön , a gyakornokok gyenge hivatkozásait tárolni kell a gyakornokkészletben.

Lásd még

Megjegyzések

Hivatkozások

Külső linkek