2011-12-05 27 views
21

Tôi đang chơi xung quanh với study, một tính năng Perl để kiểm tra một chuỗi để làm cho biểu thức thông thường sau đó có khả năng nhanh hơn nhiều:Tình huống nào được hưởng lợi từ nghiên cứu của Perl?

while(<>) { 
    study; 
    $count++ if /PATTERN/; 
    $count++ if /OTHER/; 
    $count++ if /PATTERN2/; 
    } 

Có không nhiều nói về những tình huống sẽ được hưởng lợi từ điều này. Một số điều bạn có thể trêu chọc ra khỏi the docs:

  • Patterns với các hằng xâu
  • Nhiều mẫu
  • chuỗi mục tiêu ngắn hơn có thể được tốt hơn (mất ít thời gian hơn để nghiên cứu)

Tôi tìm kiếm các trường hợp cụ thể, nơi tôi không chỉ có thể chứng minh một lợi thế lớn, nhưng cũng có trường hợp mà tôi có thể hơi tinh chỉnh để mất lợi thế đó. Một trong các cảnh báo trong số the docs là bạn nên đánh giá các trường hợp riêng lẻ. Tôi muốn tìm một số các trường hợp cạnh mà một sự khác biệt nhỏ trong một chuỗi (hoặc mẫu) làm cho một sự khác biệt lớn trong hiệu suất.

Nếu bạn chưa sử dụng study, vui lòng không trả lời. Tôi muốn có câu trả lời chính xác đúng hơn thay vì đoán nhanh. Không có sự khẩn cấp ở đây, và điều này không giữ được bất kỳ công việc nào.

Và, như một phần thưởng, tôi đã chơi với một công cụ đo điểm chuẩn so sánh hai lần chạy NYTProf, mà tôi muốn sử dụng hơn công cụ đo điểm chuẩn thông thường. Nếu tôi nghĩ ra một cách để tự động hóa điều đó, tôi cũng sẽ chia sẻ điều đó.

+1

Tôi * đã * sử dụng 'nghiên cứu', có hay không tôi * nên * đã sử dụng 'nghiên cứu' có lẽ là một phần của vấn đề bạn đang gặp phải. – Axeman

+0

Kết quả nghiên cứu của bạn là gì? –

+0

Tôi không có kết quả. Tôi đã không quan tâm đủ để làm việc ra các mã, đặc biệt là kể từ khi nó chỉ hoạt động cho các chuỗi ASCII. –

Trả lời

7

Google bật lên này lovely test scenario:

#!/usr/bin/perl 
# 
# Exercise 7.8 
# 
# This is a more difficult exercise. The study function in Perl may speed up searches 
# for motifs in DNA or protein. Read the Perl documentation on this function. Its use 
# is simple: given some sequence data in a variable $sequence, type: 
# 
# study $sequence; 
# 
# before doing the searches. Do you think study will speed up searches in DNA or 
# protein, based on what you've read about it in the documentation? 
# 
# For lots of extra credit! Now read the Perl documentation on the standard module 
# Benchmark. (Type perldoc Benchmark, or visit the Perl home page at http://www. 
# perl.com.) See if your guess is right by writing a program that benchmarks motif 
# searches of DNA and of protein, with and without study. 
# 
# Answer to Exercise 7.8 

use strict; 
use warnings; 

use Benchmark; 

my $dna = join ('', qw(
agatggcggcgctgaggggtcttgggggctctaggccggccacctactgg 
tttgcagcggagacgacgcatggggcctgcgcaataggagtacgctgcct 
gggaggcgtgactagaagcggaagtagttgtgggcgcctttgcaaccgcc 
tgggacgccgccgagtggtctgtgcaggttcgcgggtcgctggcgggggt 
cgtgagggagtgcgccgggagcggagatatggagggagatggttcagacc 
cagagcctccagatgccggggaggacagcaagtccgagaatggggagaat 
gcgcccatctactgcatctgccgcaaaccggacatcaactgcttcatgat 
cgggtgtgacaactgcaatgagtggttccatggggactgcatccggatca 
ctgagaagatggccaaggccatccgggagtggtactgtcgggagtgcaga 
gagaaagaccccaagctagagattcgctatcggcacaagaagtcacggga 
gcgggatggcaatgagcgggacagcagtgagccccgggatgagggtggag 
ggcgcaagaggcctgtccctgatccagacctgcagcgccgggcagggtca 
gggacaggggttggggccatgcttgctcggggctctgcttcgccccacaa 
atcctctccgcagcccttggtggccacacccagccagcatcaccagcagc 
agcagcagcagatcaaacggtcagcccgcatgtgtggtgagtgtgaggca 
tgtcggcgcactgaggactgtggtcactgtgatttctgtcgggacatgaa 
gaagttcgggggccccaacaagatccggcagaagtgccggctgcgccagt 
gccagctgcgggcccgggaatcgtacaagtacttcccttcctcgctctca 
ccagtgacgccctcagagtccctgccaaggccccgccggccactgcccac 
ccaacagcagccacagccatcacagaagttagggcgcatccgtgaagatg 
agggggcagtggcgtcatcaacagtcaaggagcctcctgaggctacagcc 
acacctgagccactctcagatgaggaccta 
)); 

my $protein = join('', qw(
MNIDDKLEGLFLKCGGIDEMQSSRTMVVMGGVSGQSTVSGELQD 
SVLQDRSMPHQEILAADEVLQESEMRQQDMISHDELMVHEETVKNDEEQMETHERLPQ 
GLQYALNVPISVKQEITFTDVSEQLMRDKKQIR 
)); 

my $count = 1000; 

print "DNA pattern matches without 'study' function:\n"; 
timethis($count, 
    ' for(my $i=1 ; $i < 10000; ++$i) { 
     $dna =~ /aggtc/; 
     $dna =~ /aatggccgt/; 
     $dna =~ /gatcgatcagctagcat/; 
     $dna =~ /gtatgaac/; 
     $dna =~ /[ac][cg][gt][ta]/; 
     $dna =~ /ccccccccc/; 
    } ' 
); 

print "\nDNA pattern matches with 'study' function:\n"; 
timethis($count, 
    ' study $dna; 
    for(my $i=1 ; $i < 10000; ++$i) { 
     $dna =~ /aggtc/; 
     $dna =~ /aatggccgt/; 
     $dna =~ /gatcgatcagctagcat/; 
     $dna =~ /gtatgaac/; 
     $dna =~ /[ac][cg][gt][ta]/; 
     $dna =~ /ccccccccc/; 
    } ' 
); 

print "\nProtein pattern matches without 'study' function:\n"; 
timethis($count, 
    ' for(my $i=1 ; $i < 10000; ++$i) { 
     $protein =~ /PH.EI/; 
     $protein =~ /KFTEQGESMRLY/; 
     $protein =~ /[YAL][NVP][ISV][KQE]/; 
     $protein =~ /DKKQIR/; 
     $protein =~ /[MD][VT][HQ][ER]/; 
     $protein =~ /NVPISVKQEITFTDVSEQL/; 
    } ' 
); 

print "\nProtein pattern matches with 'study' function:\n"; 
timethis($count, 
    ' study $protein; 
    for(my $i=1 ; $i < 10000; ++$i) { 
     $protein =~ /PH.EI/; 
     $protein =~ /KFTEQGESMRLY/; 
     $protein =~ /[YAL][NVP][ISV][KQE]/; 
     $protein =~ /DKKQIR/; 
     $protein =~ /[MD][VT][HQ][ER]/; 
     $protein =~ /NVPISVKQEITFTDVSEQL/; 
    } ' 
); 

Lưu ý rằng mức tăng được báo cáo là chỉ có khoảng ~ 2% đối với các trường hợp có lợi nhất (protein phù hợp):

# $ perl exer07.08 
# On my computer, this is the output I get: your results probably vary. 

# DNA pattern matches without 'study' function: 
# timethis 1000: 29 wallclock secs (29.25 usr + 0.00 sys = 29.25 CPU) @ 34.19/s (n=1000) 
# 
# DNA pattern matches with 'study' function: 
# timethis 1000: 30 wallclock secs (29.21 usr + 0.15 sys = 29.36 CPU) @ 34.06/s (n=1000) 
# 
# Protein pattern matches without 'study' function: 
# timethis 1000: 32 wallclock secs (29.47 usr + 0.04 sys = 29.51 CPU) @ 33.89/s (n=1000) 
# 
# Protein pattern matches with 'study' function: 
# timethis 1000: 30 wallclock secs (28.97 usr + 0.02 sys = 28.99 CPU) @ 34.49/s (n=1000) 
# 
+1

Bạn đã làm gì google?Tất cả các tìm kiếm của tôi đều bị hút. –

+1

Đối với những gì nó có giá trị, bất kỳ kết quả với từ Benchmark trong khoảng 7% về cơ bản là kết quả tương tự do sự không chắc chắn trong phương pháp thử nghiệm, vì vậy trường hợp này không phải là rất thú vị. Tôi rất vui vì bạn đã tìm thấy nó. –

+0

@briandfoy: vâng, đó là chủ yếu là quan điểm của tôi: nó hầu như không tạo ra bất kỳ sự khác biệt nào cho trường hợp thử nghiệm này, mà _looks_ thích nó phải rất thích hợp. [Tìm thấy liên kết] (http://www.cse.unt.edu/~mikler/Courses/BioCom2011/labs/perl_primer/perlbio/exercises_part1/exer07.08), tôi quên thêm nó vào một sự vội vàng – sehe

4

Tôi sẽ để lại ghi chú dưới dạng câu trả lời và sau đó tôi sẽ phát triển nó thành câu trả lời thực tế:

Trong pp.c 's PP(pp_study) , nó có những dòng tò mò (trừ một bình luận):

if (len == 0 || len > I32_MAX || !SvPOK(sv) || SvUTF8(sv) || SvVALID(sv)) { 
RETPUSHNO; 
} 

Dường như vô hướng với bộ cờ UTF8 không được nghiên cứu chút nào.

+1

Đồng bằng 5.10.0 đề cập rằng 'nghiên cứu' được đặt thành không có op cho dữ liệu UTF-8 http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perl5100delta.pod – dwarring

+2

Tôi ước có một chỉ số đảo ngược cho perldelta vì vậy tôi không phải nhìn qua tất cả trong số họ hy vọng một trong số họ đề cập đến điều tôi quan tâm. –

+0

@briandfoy 'git log -p -Sstudy - pod/perldelta.pod' –

2

Không thực sự. Nếu bạn tìm kiếm, và hầu hết các kết quả nằm trong bộ kiểm tra Perl, điều đó có nghĩa là không ai sử dụng nó. Ngoài ra, do lỗi, bạn chỉ có thể notice speed benefits on global variables. Nó thực sự mang lại một số cải tiến tốc độ khi giao dịch với tiếng Anh (đôi khi nhanh hơn gấp 2 lần), nhưng bạn phải biến đổi toàn cầu.

Nó cũng đôi khi gây ra infinite loops hoặc false positives (study có thể thêm lỗi cho chương trình của bạn, ngay cả khi nó đã được chỉ cho là để làm cho nó nhanh hơn), và vì lý do đó nó là removed (or rather, made no-op) in Perl 5.16 – không ai muốn duy trì một phần không ai quan tâm về nào .

Các vấn đề liên quan