คำอธิบายของคุณว่าทำไมมันไม่มีประสิทธิภาพมีความถูกต้องอย่างน้อยในภาษาที่ฉันคุ้นเคยกับ (C, Java, C #) แม้ว่าฉันจะไม่เห็นด้วยที่มันเป็นเรื่องปกติในระดับสากลเพื่อทำการเรียงต่อกันของสตริงจำนวนมาก ในรหัส C # ที่ฉันทำงานมีการใช้งานจำนวนStringBuilder
มากString.Format
และอื่น ๆ ซึ่งเป็นหน่วยความจำที่บันทึก techiniques เพื่อหลีกเลี่ยงการจัดสรรซ้ำ
ดังนั้นเพื่อให้ได้คำตอบสำหรับคำถามของคุณเราต้องถามคำถามอื่น: ถ้ามันไม่เคยเป็นปัญหาในการเชื่อมโยงสตริงทำไมคลาสถึงชอบStringBuilder
และStringBuffer
มีอยู่จริง ? เหตุใดการใช้คลาสดังกล่าวจึงรวมอยู่ในหนังสือและแม้แต่การเขียนโปรแกรมกึ่งเริ่มต้นด้วย? เหตุใดคำแนะนำในการปรับให้เหมาะสมสูงสุดก่อนที่จะปรากฏจึงโดดเด่นมาก
หากส่วนใหญ่นักพัฒนาสตริงเชื่อมโยงเป็นฐานคำตอบของพวกหมดจดในประสบการณ์ส่วนใหญ่จะบอกว่ามันไม่เคยทำให้ความแตกต่างและจะหลีกเลี่ยงการใช้เครื่องมือดังกล่าวในความโปรดปรานของ for (int i=0; i<1000; i++) { strA += strB; }
"อ่านได้มากขึ้น" แต่พวกเขาไม่เคยวัดมัน
คำตอบที่แท้จริงสำหรับคำถามนี้สามารถพบได้ในคำตอบดังนั้นนี้ซึ่งแสดงให้เห็นว่าในหนึ่งตัวอย่างเช่นเมื่อเชื่อมโยง 50,000 สตริง (ซึ่งขึ้นอยู่กับโปรแกรมของคุณอาจจะเป็นที่เกิดขึ้นร่วมกัน) แม้คนเล็กส่งผลให้ประสิทธิภาพตี 1000x
หากการแสดงนั้นไม่ได้มีความหมายอะไรเลยเลย แต่ฉันไม่เห็นด้วยว่าการใช้ทางเลือก (StringBuilder) นั้นยากหรืออ่านได้น้อยกว่าและดังนั้นจึงเป็นวิธีการเขียนโปรแกรมที่สมเหตุสมผลซึ่งไม่ควรเรียกใช้การป้องกัน "การเพิ่มประสิทธิภาพก่อนวัยอันควร"
UPDATE:
ผมคิดว่าสิ่งนี้จะลงมาให้เป็นรู้ว่าแพลตฟอร์มของคุณและปฏิบัติตามวิธีปฏิบัติที่ดีที่สุดซึ่งเป็นเศร้าไม่เป็นสากล ตัวอย่างสองตัวอย่างจาก "ภาษาสมัยใหม่" ที่ต่างกัน:
- ในคำตอบ SO อื่นที่ตรงข้ามแน่นอนลักษณะการปฏิบัติงาน (array.join VS + =) พบว่ามีบางครั้งที่แท้จริงในการใช้ JavaScript ในบางเบราว์เซอร์การต่อข้อมูลสตริงจะได้รับการปรับให้เหมาะสมโดยอัตโนมัติและในกรณีอื่น ๆ ดังนั้นข้อเสนอแนะ (อย่างน้อยก็ในคำถาม SO นั้น) คือการต่อกันและไม่ต้องกังวล
- ในกรณีอื่นคอมไพเลอร์Java สามารถแทนที่การต่อข้อมูลอัตโนมัติด้วยโครงสร้างที่มีประสิทธิภาพมากขึ้นเช่น StringBuilder อย่างไรก็ตามตามที่คนอื่น ๆ ชี้ว่าสิ่งนี้เป็นแบบไม่แน่นอนไม่รับประกันและการใช้ StringBuilder จะไม่ทำร้ายความสามารถในการอ่าน ในกรณีพิเศษนี้ฉันมักจะแนะนำให้ใช้การต่อข้อมูลขนาดใหญ่สำหรับคอลเลกชันขนาดใหญ่หรืออาศัยการทำงานของคอมไพเลอร์ Java แบบไม่กำหนดเวลา ในทำนองเดียวกันใน .NET, การเพิ่มประสิทธิภาพของการจัดเรียงไม่ได้ดำเนินการเลยทีเดียว
มันไม่ใช่บาปที่สำคัญที่จะไม่ทราบความแตกต่างของทุกแพลตฟอร์มทันที แต่การเพิกเฉยปัญหาแพลตฟอร์มที่สำคัญเช่นนี้เกือบจะเหมือนกับการย้ายจาก Java เป็น C ++ และไม่สนใจเกี่ยวกับการจัดสรรคืนหน่วยความจำ