ในการหาวิธีที่รวดเร็วที่สุดในการอ่านไฟล์แต่ละบรรทัดคุณจะต้องทำการเปรียบเทียบ ฉันทำการทดสอบเล็กน้อยบนคอมพิวเตอร์ของฉันแล้ว แต่คุณไม่สามารถคาดหวังได้ว่าผลลัพธ์ของฉันจะนำไปใช้กับสภาพแวดล้อมของคุณ
ใช้ StreamReader.ReadLine
นี่เป็นวิธีการของคุณ ด้วยเหตุผลบางอย่างคุณตั้งค่าขนาดบัฟเฟอร์เป็นค่าที่น้อยที่สุด (128) การเพิ่มสิ่งนี้จะเป็นการเพิ่มประสิทธิภาพโดยทั่วไป ขนาดเริ่มต้นคือ 1,024 และตัวเลือกที่ดีอื่น ๆ คือ 512 (ขนาดเซกเตอร์ใน Windows) หรือ 4,096 (ขนาดคลัสเตอร์ใน NTFS) คุณจะต้องเรียกใช้เกณฑ์มาตรฐานเพื่อกำหนดขนาดบัฟเฟอร์ที่เหมาะสมที่สุด บัฟเฟอร์ที่ใหญ่กว่าคือ - ถ้าไม่เร็วกว่า - อย่างน้อยไม่ช้ากว่าบัฟเฟอร์ที่เล็กกว่า
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
// Process line
}
FileStream
คอนสตรัคช่วยให้คุณระบุFileOptions FileOptions.SequentialScan
ตัวอย่างเช่นถ้าคุณกำลังอ่านไฟล์ขนาดใหญ่ตามลำดับตั้งแต่ต้นจนจบคุณอาจได้รับประโยชน์จาก การเปรียบเทียบเป็นสิ่งที่ดีที่สุดที่คุณสามารถทำได้
ใช้ไฟล์. ReadLines
นี่เป็นเหมือนโซลูชันของคุณเองยกเว้นว่าจะมีการใช้งานโดยใช้StreamReader
ขนาดบัฟเฟอร์คงที่ 1,024 ในคอมพิวเตอร์ของฉันผลลัพธ์นี้มีประสิทธิภาพที่ดีขึ้นเล็กน้อยเมื่อเทียบกับรหัสของคุณด้วยขนาดบัฟเฟอร์ 128 อย่างไรก็ตามคุณสามารถเพิ่มประสิทธิภาพการทำงานเดียวกันโดยใช้ขนาดบัฟเฟอร์ที่ใหญ่ขึ้น วิธีนี้ถูกนำมาใช้โดยใช้บล็อกตัววนซ้ำและไม่ใช้หน่วยความจำสำหรับทุกบรรทัด
var lines = File.ReadLines(fileName);
foreach (var line in lines)
// Process line
ใช้ File.ReadAllLines
นี่เป็นวิธีที่เหมือนกับวิธีก่อนหน้านี้ยกเว้นว่าวิธีนี้จะเพิ่มรายการของสตริงที่ใช้สร้างอาร์เรย์ที่ส่งคืนของบรรทัดดังนั้นความต้องการหน่วยความจำจึงสูงขึ้น อย่างไรก็ตามมันจะส่งคืนString[]
และไม่ใช่การIEnumerable<String>
อนุญาตให้คุณเข้าถึงบรรทัดแบบสุ่ม
var lines = File.ReadAllLines(fileName);
for (var i = 0; i < lines.Length; i += 1) {
var line = lines[i];
// Process line
}
ใช้ String.Split
วิธีนี้ช้ากว่าปกติมากอย่างน้อยในไฟล์ขนาดใหญ่ (ทดสอบในไฟล์ 511 KB) อาจเป็นเพราะวิธีString.Split
การใช้งาน นอกจากนี้ยังจัดสรรอาร์เรย์สำหรับทุกบรรทัดที่เพิ่มหน่วยความจำที่ต้องการเปรียบเทียบกับโซลูชันของคุณ
using (var streamReader = File.OpenText(fileName)) {
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
// Process line
}
ข้อเสนอแนะของฉันคือการใช้File.ReadLines
เพราะมันสะอาดและมีประสิทธิภาพ หากคุณต้องการตัวเลือกการแชร์พิเศษ (ตัวอย่างเช่นคุณใช้FileShare.ReadWrite
) คุณสามารถใช้รหัสของคุณเอง แต่คุณควรเพิ่มขนาดบัฟเฟอร์
Fastest
คุณหมายถึงจากประสิทธิภาพหรือมุมมองการพัฒนา