grep ใช้แคชเพื่อเพิ่มความเร็วในการค้นหาหรือไม่?


35

ฉันได้สังเกตเห็นว่าการรันที่ตามมาของgrepเคียวรีเดียวกัน (และเคียวรีที่แตกต่างกัน แต่ในไฟล์เดียวกัน) นั้นเร็วกว่าการรันครั้งแรกมาก

สิ่งนี้แสดงให้เห็นว่า grep ใช้การแคชแบบโครงสร้างที่ใช้สำหรับการค้นหา แต่ฉันไม่สามารถหาข้อมูลอ้างอิงบนอินเทอร์เน็ตได้

กลไกใดที่ช่วยgrepให้ได้ผลลัพธ์เร็วขึ้นในการค้นหาครั้งต่อไป

คำตอบ:


59

ไม่ใช่ grep เช่นนี้ แต่บ่อยครั้งที่ระบบไฟล์มักจะแคชอ่านข้อมูลทำให้การทำงานในภายหลังเร็วขึ้นเนื่องจาก grep สามารถค้นหาในหน่วยความจำได้อย่างมีประสิทธิภาพแทนที่จะเป็นดิสก์


2
ฉันเห็นด้วย ครั้งแรกที่คุณ grep ไฟล์รหัสระบบไฟล์จะโหลดไฟล์จากดิสก์ไปยังแคช เมื่อคุณ grep อีกครั้งหลังจากนั้นไม่ได้มีเวลาหมดอายุจากแคช ดูว่ามีวิธีล้างแคชของระบบไฟล์ด้วยตนเองหรือไม่จากนั้นเปรียบเทียบก่อนและหลังเวลา
Shadur

3
@Shadur - มีวิธีหนึ่งคือ ดูunix.stackexchange.com/questions/8398/…
mattdm

3
ไม่มีความแตกต่างในทางปฏิบัติ แต่เป็นแคชเคอร์เนลไม่ใช่ระบบไฟล์
pboin

@ pboin ตกลงฉันใช้ทางลัดเล็กน้อย แน่นอนว่ามันเป็นส่วนหนึ่งของเคอร์เนลที่จัดการกับระบบไฟล์ที่จะทำการแคชไม่ใช่ระบบไฟล์ (บนดิสก์) ในตัวมันเอง อวดรู้ แต่จริง :)
PaulRein

19

ระบบ Linux และ * NIX ใช้ประโยชน์จากแคชต่างๆที่อยู่ระหว่างระบบไฟล์ (abstracted ถึง VFS) และกระบวนการระดับผู้ใช้ ดังนั้นจึงไม่ใช่ grep และไม่ใช่ระบบไฟล์ที่ทำการแคช - เป็นระบบปฏิบัติการ

แคชที่รับผิดชอบประสิทธิภาพการทำงานของ grep ของคุณคือ VFS Buffer Cache แคชอื่น ๆ ใช้สำหรับ inodes และไดเร็กตอรี่ แต่จะไม่เข้ามาที่นี่

ดูข้อมูลเพิ่มเติมได้ที่: โครงการเอกสารลินุกซ์: 9.2 The Virtual File System http://tldp.org/LDP/tlk/fs/filesystem.html


5
หากคุณทำ grep แบบเรียกซ้ำแคช inode และ dentry สร้างความแตกต่างที่เห็นได้ชัดเจน ในการทดสอบ grep ภายใน/usr/includeใช้เวลาประมาณ 16.4 วินาทีในระบบของฉันโดยที่แคชทั้งหมดลดลง กับทุกสิ่งที่แคชประมาณ 0.3 วินาที ถ้าฉันทิ้งเฉพาะแคชของเพจ (ซึ่งเก็บแคชบัฟเฟอร์) มันจะใช้เวลา ~ 14.3 วินาที ถ้าฉันออกจากแคชของหน้าและวางเดนท์แคช / inode แคชก็ประมาณ 12 วินาที
mattdm

@attdm นั่นน่าสนใจ คุณวางแคชได้อย่างไร
JRW


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.