วิธีเลียนแบบ wc -l ใน Raku


9

ใน perl 5 คุณสามารถจำลองwc -lโดยใช้ oneliner:

perl -lnE 'END {say $.}' test.txt

วิธีการใช้งานฟังก์ชั่นนี้ใน Raku

หากคุณพยายามใช้สิ่งนี้:

raku -e 'say "test.txt".IO.open.lines.elems'

ปรากฎว่าช้าและใช้หน่วยความจำมาก

ข้อมูลสำหรับการทำซ้ำ:

$ wget http://eforexcel.com/wp/wp-content/uploads/2017/07/1500000%20Sales%20Records.zip
$ unzip "1500000 Sales Records.zip"
$ mv "1500000 Sales Records.csv" part.txt
$ for i in `seq 1 10`; do cat part.txt >> test.txt ; done
$ du -sh test.txt
1.8G    test.txt

$ time wc -l test.txt
15000000 test.txt

real    0m0,350s
user    0m0,143s
sys     0m0,205s

$ time perl -lnE 'END { say $. }' test.txt
15000001

real    0m1,981s
user    0m1,719s
sys     0m0,256s

$ time raku -e 'say "test.txt".IO.open.lines.elems'
15000001

real    2m51,852s
user    0m25,129s
sys     0m6,378s

# Using swap (maximum uses 2.2G swap):
# Before `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009        1695       12604         107         708       12917
Swap:          7583           0        7583

# After `raku -e ''`

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15009         752       13923          72         332       13899
Swap:          7583         779        6804

# Swap not used
$ time raku -ne '++$ andthen END .say' test.txt
15000001

real    1m44,906s
user    2m14,165s
sys     0m0,653s

$ raku -v
This is Rakudo version 2019.11 built on MoarVM version 2019.11
implementing Perl 6.d.

3
คุณสามารถเพิ่มข้อมูลเวลาและผลลัพธ์จริงของwc(ซึ่งควรมีขนาดไฟล์) ขอบคุณ.
Elizabeth Mattijsen

อัปเดตคำถาม - ตัวอย่างที่เพิ่มเข้ามาเพื่อสร้างซ้ำ
TheAthlete

2
@TheAthlete ขอบคุณสำหรับข้อมูลที่เพิ่มเข้ามา ฉันคิดว่ามันน่าจะเป็นสิ่งที่น่าสนใจในอดีต [raku] ดังนั้นเนื่องจากการปิดช่องว่างของ rakudo อย่างคงที่ในช่วงหลายปีที่ผ่านมาดังนั้นโปรดพิจารณาเพิ่มข้อมูลอีกเล็กน้อย ครั้งแรกแม้ว่าจะชัดเจนว่าคุณกำลังใช้ rakudo เมื่อเร็ว ๆ นี้ (เพราะคุณกำลังเขียนraku) มันก็ยังดีที่มีraku -vเอาต์พุต นอกจากนี้โปรดพิจารณาเพิ่มผลลัพธ์ของเวลาของคำแนะนำปัจจุบันของฉัน นอกจากนี้ฉันอาจพิจารณาเปลี่ยนไปใช้'ascii'ตัวถอดรหัสในช่วงสุดสัปดาห์นี้เพื่อให้มีเวลาที่ดีขึ้น
raiph

1
ในหมายเหตุด้าน: -lธงสำหรับ perl ช้า perl อย่างมีนัยสำคัญและมันไม่เป็นประโยชน์ในกรณีนี้ บนเครื่องของฉันสำหรับไฟล์ที่มีความยาวบรรทัดสุ่มและประมาณ 200k บรรทัดการลบ-lผลลัพธ์ในการปรับปรุง 40%
โซริน

คำตอบ:


8

ตัวเลือกหนึ่งที่ยังมีแนวโน้มที่จะค่อนข้างช้าเมื่อเทียบกับperlแต่ก็คุ้มค่าเมื่อเปรียบเทียบ:

raku -ne '++$ andthen END .say' test.txt

lเลือกบรรทัดคำสั่งซ้ำซ้อน

$ เป็นสเกลาร์ของรัฐนิรนาม

andthenทดสอบว่ามีการกำหนด lhs และหากเป็นเช่นนั้นให้ตั้งค่านั้นเป็นหัวข้อ ( $_) จากนั้นประเมิน rhs ของมัน

ENDมีความคล้ายคลึงกับ'sperl ENDโปรดทราบว่ามันกลับNilไปที่andthenแต่ไม่สำคัญที่นี่เพราะเราใช้ENDคำสั่งของผลข้างเคียง

มีหลายสิ่งที่จะส่งผลต่อความเร็วของรหัสนี้ บางสิ่งที่ฉันคิดได้:

  • ค่าเริ่มต้นของคอมไพเลอร์ ละเว้นโมดูลใด ๆ ที่ถูกนำมาใช้ที่rakuคอมไพเลอร์ Rakudo perlมีค่าใช้จ่ายเริ่มต้นประมาณสิบวินาทีบนฮาร์ดแวร์ทั่วไปเมื่อเทียบกับหนึ่งเล็กน้อยเป็นธรรมสำหรับ

  • ความคิดของ "เส้น" ในperlความคิดเริ่มต้นของการประมวลผลบรรทัดกำลังอ่านชุดของไบต์ซึ่งบางส่วนเป็นตัวแทนของปลายสาย ในrakuความคิดเริ่มต้นของการประมวลผลบรรทัดกำลังอ่านสตริง UTF-8 ซึ่งบางส่วนแสดงถึงปลายสาย ดังนั้นจึงperlมีค่าใช้จ่ายในการอ่านของตัวถอดรหัส ASCII (หรือ ASCII เพิ่มเติม) ในขณะที่rakuเกิดค่าใช้จ่ายในการอ่านของตัวถอดรหัส UTF-8

  • การเพิ่มประสิทธิภาพของคอมไพเลอร์ perlโดยทั่วไปจะปรับให้สูงสุด มันจะไม่แปลกใจเลยถ้าperl -lnE 'END {say $.}' test.txtใช้ประโยชน์จากการเพิ่มประสิทธิภาพที่ชาญฉลาด ในทางตรงกันข้ามการเพิ่มประสิทธิภาพการทำงานของ Rakudo ยังอยู่ในช่วงแรกที่พูดค่อนข้างมาก

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

จะมีวิธีในการแก้ไข UTF-8-by-raku ของ raku บางทีสิ่งต่อไปนี้อาจเป็นไปได้และเร็วกว่าการเริ่มต้นของ raku อย่างน้อยก็ไม่สนใจค่าใช้จ่ายที่เรียกว่าโมดูลfoo:

raku -Mfoo -ne '++$ andthen END .say' test.txt

ที่โมดูลfooสวิทช์เริ่มต้นการเข้ารหัสไฟล์ I / O ASCII หรืออะไรก็ตามจากการเข้ารหัสที่มีอยู่

ฉันไม่ได้ตรวจสอบว่านี่เป็นจริงได้ใน Rakudo ปัจจุบัน แต่จะแปลกใจหากไม่ได้

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