วิธีการ grep คำสั่งอย่างถูกต้องเวลา?


9

ฉันต้องการเปรียบเทียบความเร็วของคำสั่งสองคำนี้:

grep pattern1 files* 
grep pattern2 files* 

น่าเสียดายที่ grep แรกอ่านไฟล์จำนวนมาก * ลงในบัฟเฟอร์หน่วยความจำดังนั้น grep ตัวที่สองจึงทำงานได้อย่างรวดเร็ว แต่ด้วยเหตุผลที่ผิด

ฉันจะบอก Linux ได้อย่างไร (Fedora 11): "โปรดหยุดการอ่านดิสก์แคชเพราะฉันกำลังทดสอบบางอย่าง"


อาจมีคำตอบที่ฉลาดกว่า ... แต่คุณสามารถทำซ้ำโครงสร้างไดเรกทอรีดังนั้นคุณจะไม่ต้องจัดการกับไฟล์เดียวกันและคุณจะไม่มีปัญหาการแคช!
โก้

1
ในขณะที่: Fedora 11 ถึงจุดสิ้นสุดของชีวิตในเดือนมิถุนายน 2010 ถึงเวลาที่จะอัพเกรด การเปิดตัว Fedora 15 ที่กำลังมาถึงนั้นดูดีมากจริงๆ หรือถ้าคุณต้องการบางสิ่งบางอย่างที่มีความเสถียรมากกว่าอายุการใช้งานที่ยาวนานกว่า (และดูเหมือนว่าคุณอาจจะยังอยู่ในช่วงอายุ 11) จะมี RHEL6 หรือ CentOS 6 วันใดก็ได้ในวันนี้
mattdm

ฉันใช้ตลอดไปเพื่ออัพเกรดจาก RH 7.3 เป็นอย่างนั้น! การอัพเกรดทำลายสิ่งต่าง ๆ และทำให้ฉันตกใจ
barrycarter

2
เมื่อปิดการแคชคุณจะไม่ได้วัดความเร็วของการจับคู่รูปแบบ แต่เป็นความเร็วของไดรฟ์ ตามที่คนอื่นแนะนำ - เพียงแค่เรียกใช้คำสั่งแรกสองครั้ง: ก่อนอื่นให้ทำการแคชเป็นอันดับแรกรองจากการวัดประสิทธิภาพ
alex

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

คำตอบ:


11

ฉันไม่คิดว่าคุณสามารถบอกได้ว่า "หยุดแคชชั่วคราว" แต่สิ่งที่คุณสามารถทำได้คือบอกให้ระบบปล่อยแคชก่อนการเรียกใช้แต่ละครั้ง:

ในฐานะที่เป็นราก:

sync; echo 3 > /proc/sys/vm/drop_caches

(นี่คือเอกสารในเคอร์เนล docs ที่Documentation / sysctl / vm.txtซึ่งมีประโยชน์ถ้าเราบางคนคุณจำไม่ได้ทันทีว่าค่า 1, 2 หรือ 3 ทำอะไร)

หรืออีกวิธีหนึ่งคือเลือกแคชและเปรียบเทียบประสิทธิภาพแคช (ฉันคิดว่าทั้งคู่เป็นตัวเลขที่มีประโยชน์)


1
echo 1จะวางแคชหน้าเท่านั้นไม่ใช่ดิสก์แคชใด ๆ
jsbillings

@jsbillings - เอ่อใช่ แก้ไขแล้ว.
mattdm

การวางยาเล็กน้อยอย่างไม่น่าเชื่อ: ฉันต้องทำ ">>" ไม่ใช่ ">"
barrycarter

@barrycarter: จริงเหรอ? ฮะ!
mattdm

3
@barrycarter: คุณอาจตั้งค่า -o noclobber ในเชลล์ของคุณซึ่งจะทำให้ไม่อนุญาตให้คุณใช้> เพื่อเขียนทับไฟล์ที่มีอยู่
jsbillings

1

เมื่อเวลาสิ่งต่าง ๆ เช่นนี้ฉันมักจะเรียกใช้ก่อนที่จะสำคัญแคช จากนั้นรันคำสั่งโดยใช้เวลา ในการทดสอบบางอย่างเช่นนี้คุณควรกังวลเกี่ยวกับ CPU และเวลาที่ผ่านไปและกังวลเกี่ยวกับเวลา I / O น้อยลง

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


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

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