อ่าน 2 นาที
การฝึกงานด้านสตริง
ในวิทยาการคอมพิวเตอร์ การจัดเก็บสตริงแบบ Interning เป็นวิธีการจัดเก็บ ค่า สตริง ที่แตกต่างกันเพียงชุดเดียว ซึ่งต้องไม่สามารถ เปลี่ยนแปลงได้ [ 1 ] การ จัดเก็บสตริงแบบ Interning...
การฝึกงานด้านสตริง
ในวิทยาการคอมพิวเตอร์การจัดเก็บสตริงแบบ Interningเป็นวิธีการจัดเก็บ ค่า สตริง ที่แตกต่างกันเพียงชุดเดียว ซึ่งต้องไม่สามารถเปลี่ยนแปลงได้ [ 1 ] การจัดเก็บสตริงแบบ Interning ทำให้งานประมวลผลสตริงบางอย่างมีประสิทธิภาพด้านเวลาหรือพื้นที่มากขึ้น โดยแลกกับการต้องใช้เวลามากขึ้นเมื่อสร้างหรือจัดเก็บสตริง ค่าที่แตกต่างกันจะถูกจัดเก็บไว้ในพูลจัดเก็บสตริงแบบ Interning
สำเนาเดียวของแต่ละสตริงเรียกว่าinternและโดยทั่วไปจะค้นหาโดยใช้วิธีของคลาสสตริง เช่น String.intern() [ 2 ]ในJavaสตริงคงที่ทั้งหมดในเวลาคอมไพล์ใน Java จะถูกจัดเก็บโดยอัตโนมัติโดยใช้วิธีนี้[ 3 ]
การจัดเก็บข้อมูลสตริงได้รับการสนับสนุนโดยภาษาการเขียนโปรแกรมเชิงวัตถุ สมัยใหม่บางภาษา รวมถึง Java, Python , PHP (ตั้งแต่เวอร์ชัน 5.4), Lua [ 4 ] และภาษา . NET [ 5 ] Lisp , Scheme , Julia , RubyและSmalltalkเป็นหนึ่งในภาษาที่มี ประเภท สัญลักษณ์ซึ่งโดยพื้นฐานแล้วคือสตริงที่จัดเก็บไว้ ไลบรารีของStandard ML of New Jerseyมีประเภทที่ทำเช่นเดียวกัน ตัวเลือกของ Objective-Cซึ่งส่วนใหญ่ใช้เป็นชื่อเมธอด ก็คือสตริงที่จัดเก็บไว้ atom
อ็อบเจ็กต์อื่นที่ไม่ใช่สตริงสามารถถูกจัดเก็บได้ ตัวอย่างเช่น ใน Java เมื่อค่าพื้นฐานถูกบรรจุลงในอ็อบเจ็กต์ wrapperค่าบางค่า (any boolean, any byte, any charตั้งแต่ 0 ถึง 127 และ any shortหรือintระหว่าง −128 ถึง 127) จะถูกจัดเก็บ และการแปลง boxing สองครั้งใดๆ ของค่าเหล่านี้รับประกันว่าจะได้ผลลัพธ์เป็นอ็อบเจ็กต์เดียวกัน[ 6 ]
ประวัติศาสตร์
ภาษา Lispนำเสนอแนวคิดเรื่องสตริงที่จัดเก็บไว้ภายใน (interned strings) สำหรับสัญลักษณ์ต่างๆในอดีตโครงสร้างข้อมูลที่ใช้เป็นแหล่งเก็บสตริงที่จัดเก็บไว้ภายในเรียกว่าobist (เมื่อถูกนำไปใช้ในรูปแบบลิสต์เชื่อมโยง ) หรือobarray (เมื่อถูกนำไปใช้ในรูปแบบอาร์เรย์)
โดยทั่วไปแล้ว ภาษา Lisp สมัยใหม่จะแยกความแตกต่างระหว่างสัญลักษณ์กับสตริง การจัดเก็บสตริงไว้ในหน่วยความจำชั่วคราว (interning) จะส่งคืนสัญลักษณ์ที่มีอยู่แล้วหรือสร้างสัญลักษณ์ใหม่ซึ่งมีชื่อเดียวกับสตริงนั้น สัญลักษณ์มักมีคุณสมบัติเพิ่มเติมที่สตริงไม่มี เช่น การจัดเก็บค่าที่เกี่ยวข้อง หรือการกำหนดชื่อเฉพาะ (namespacing) ความแตกต่างนี้ยังมีประโยชน์ในการป้องกันการเปรียบเทียบสตริงที่จัดเก็บไว้ในหน่วยความจำชั่วคราวกับสตริงที่ไม่ได้จัดเก็บไว้ในหน่วยความจำชั่วคราวโดยไม่ได้ตั้งใจ ซึ่งอาจนำไปสู่ความล้มเหลวเป็นระยะๆ ขึ้นอยู่กับรูปแบบการใช้งาน
แรงจูงใจ
การจัดเก็บข้อมูลสตริง (String interning) ช่วยเพิ่มความเร็วในการเปรียบเทียบสตริง ซึ่งบางครั้งเป็นคอขวดด้านประสิทธิภาพในแอปพลิเคชัน (เช่นคอมไพเลอร์และ รันไทม์ ของภาษาโปรแกรมแบบไดนามิก ) ที่พึ่งพาอาร์เรย์แบบเชื่อมโยงที่มีคีย์เป็นสตริงเพื่อค้นหาแอตทริบิวต์และเมธอดของอ็อบเจ็กต์เป็นอย่างมาก หากไม่มีการจัดเก็บข้อมูลสตริง การเปรียบเทียบสตริงสองสตริงที่แตกต่างกันอาจต้องตรวจสอบทุกอักขระของทั้งสองสตริง ซึ่งช้าด้วยหลายสาเหตุ: โดยพื้นฐานแล้วมีประสิทธิภาพเป็นO(n)ตามความยาวของสตริง; โดยทั่วไปแล้วต้องอ่านจากหลายส่วนของหน่วยความจำซึ่งใช้เวลา; และการอ่านจะทำให้แคชของโปรเซสเซอร์เต็ม หมายความว่ามีแคชเหลือน้อยลงสำหรับความต้องการอื่นๆ ด้วยสตริงที่จัดเก็บข้อมูลแล้วการทดสอบความเหมือนของอ็อบเจ็กต์ อย่างง่าย ก็เพียงพอแล้วหลังจากดำเนินการจัดเก็บข้อมูลสตริงครั้งแรก โดยทั่วไปแล้วจะดำเนินการในรูปแบบของการทดสอบความเท่าเทียมกันของตัวชี้ ซึ่งโดยปกติแล้วจะเป็นเพียงคำสั่งเครื่องเดียวที่ไม่มีการอ้างอิงหน่วยความจำเลย
การจัดเก็บข้อมูลสตริงยังช่วยลดการใช้หน่วยความจำหากมีค่าสตริงเดียวกันหลายรายการ เช่น เมื่ออ่านจากเครือข่ายหรือจากที่เก็บ ข้อมูล สตริง ดังกล่าวอาจมีตัวเลขมหัศจรรย์หรือ ข้อมูล โปรโตคอลเครือข่ายตัวอย่างเช่น ตัวแยกวิเคราะห์ XML อาจจัดเก็บข้อมูลชื่อแท็กและแอตทริบิวต์เพื่อประหยัดหน่วยความจำ การถ่ายโอนวัตถุผ่านเครือข่ายโดยใช้สตรีมวัตถุการเรียงลำดับ RMI ของ Java สามารถถ่ายโอนสตริงที่จัดเก็บข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น เนื่องจากมีการใช้แฮนเดิลของวัตถุสตริงแทนวัตถุที่ซ้ำกันเมื่อทำการเรียงลำดับ[ 7 ]
ปัญหา
มัลติเธรดดิ้ง
หากสตริงที่ถูกจัดเก็บไว้ไม่สามารถเปลี่ยนแปลงได้ ข้อเสียประการหนึ่งคือการจัดเก็บสตริงอาจเป็นปัญหาเมื่อใช้ร่วมกับมัลติเธรดดิ้งในหลายระบบ สตริงที่จัดเก็บไว้จะต้องเป็นแบบทั่วโลกในทุกเธรดภายในพื้นที่แอดเดรส (หรือในบริบทใดๆ ที่อาจแชร์พอยเตอร์) ดังนั้นพูลจัดเก็บจึงเป็นทรัพยากรทั่วโลกที่ควรซิงโครไนซ์เพื่อการเข้าถึงพร้อมกันอย่างปลอดภัย แม้ว่าสิ่งนี้จะมีผลต่อการสร้างสตริงเท่านั้น (ซึ่งพูลจัดเก็บจะต้องได้รับการตรวจสอบและแก้ไขหากจำเป็น) และ อาจใช้ การล็อกแบบตรวจสอบสองครั้งบนแพลตฟอร์มที่การเพิ่มประสิทธิภาพนี้ปลอดภัย แต่ความจำเป็นในการกีดกันร่วมกันเมื่อแก้ไขพูลจัดเก็บอาจมีค่าใช้จ่ายสูง[ 8 ]
ปัญหาการแย่งใช้ทรัพยากรยังสามารถลดลงได้ด้วยการแบ่งพื้นที่จัดเก็บสตริงออกเป็นหลายกลุ่ม ซึ่งสามารถซิงโครไนซ์ได้อย่างอิสระจากกันและกัน
เรียกคืนสตริงที่ถูกจัดเก็บไว้แต่ไม่ได้ใช้งาน
การใช้งานสตริงแบบฝังตัว (interned strings) จำนวนมากไม่ได้พยายามเรียกคืน (ด้วยตนเองหรือวิธีอื่น) สตริงที่ไม่ได้ใช้งานแล้ว สำหรับแอปพลิเคชันที่จำนวนสตริงแบบฝังตัวมีน้อยหรือคงที่ หรือมีอายุการใช้งานสั้น การสูญเสียทรัพยากรระบบอาจยอมรับได้ แต่สำหรับระบบที่ทำงานต่อเนื่องยาวนานซึ่งมีการสร้างสตริงแบบฝังตัวจำนวนมากในระหว่างการทำงาน อาจมีความจำเป็นต้องเรียกคืนสตริงแบบฝังตัวที่ไม่ได้ใช้งานแล้ว งานนี้สามารถจัดการได้โดยตัวเก็บขยะ (garbage collector)แต่เพื่อให้ทำงานได้อย่างถูกต้องการอ้างอิงแบบอ่อน (weak references)ไปยังสตริงแบบฝังตัวจะต้องถูกเก็บไว้ในพูลของสตริงแบบฝังตัว (intern pool)
ดูเพิ่มเติม
ลิงก์ภายนอก
- คลาส String ของ Visual J#
- คลาสสตริงของ .NET
- ไลบรารี Guava Java - Interner - String.intern ที่ไม่อนุญาตและรองรับประเภทข้อมูลที่ไม่เปลี่ยนแปลงอื่นๆ ทั้งแบบ weak และ strong referenced implementations
- ทำความเข้าใจเมธอด intern() ของ Java สำหรับสตริง
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การฝึกงานด้านสตริง
ในวิทยาการคอมพิวเตอร์ การจัดเก็บสตริงแบบ Interning เป็นวิธีการจัดเก็บ ค่า สตริง ที่แตกต่างกันเพียงชุดเดียว ซึ่งต้องไม่สามารถ เปลี่ยนแปลงได้ [ 1 ] การ จัดเก็บสตริงแบบ Interning...
ประวัติศาสตร์
ภาษา Lisp นำเสนอแนวคิดเรื่องสตริงที่จัดเก็บไว้ภายใน (interned strings) สำหรับ สัญลักษณ์ต่างๆ ในอดีต โครงสร้างข้อมูล ที่ใช้เป็นแหล่งเก็บสตริงที่จัดเก็บไว้ภายในเรียกว่า obist (เมื่อถูกนำไปใช้ในรูป แบบลิสต์เชื่อมโยง ) หรือ obarray...
แรงจูงใจ
การจัดเก็บข้อมูลสตริง (String interning) ช่วยเพิ่มความเร็วในการเปรียบเทียบสตริง ซึ่งบางครั้งเป็นคอขวดด้านประสิทธิภาพในแอปพลิเคชัน (เช่น คอมไพเลอร์ และ รันไทม์ ของภาษาโปรแกรมแบบไดนามิก ) ที่พึ่งพา อาร์เรย์แบบ...
มัลติเธรดดิ้ง
หากสตริงที่ถูกจัดเก็บไว้ไม่สามารถเปลี่ยนแปลงได้ ข้อเสียประการหนึ่งคือการจัดเก็บสตริงอาจเป็นปัญหาเมื่อใช้ร่วมกับ มัลติเธรดดิ้ง ในหลายระบบ สตริงที่จัดเก็บไว้จะต้องเป็นแบบทั่วโลกในทุกเธรดภายในพื้นที่แอดเดรส (หรือในบริบทใดๆ ที่อาจแชร์พอยเตอร์)...