2008-10-10 27 views
6

Tôi cần thực hiện rất nhiều tìm kiếm các mẫu nhất định trong tệp nguồn trong khi người dùng đang thay đổi chúng, vì vậy tôi cần thực hiện đối sánh regexp hiệu quả về thời gian và bộ nhớ. Mẫu lặp lại chính nó nên được biên dịch một lần, nhưng tôi cần có khả năng truy xuất các phần con (thay vì chỉ xác nhận một kết quả phù hợp)java.util.regexp có đủ hiệu quả không?

Tôi đang xem xét sử dụng java.util.regexp hoặc Jakarta perl5util (nếu nó vẫn tồn tại , đã được một vài năm kể từ khi tôi sử dụng nó), hoặc có lẽ là công cụ tìm kiếm Eclipse mặc dù tôi nghi ngờ rằng ti thông minh hơn.

Có sự khác biệt hiệu suất đáng kể nào giữa hai loại này không?

Trả lời

9

Tôi không chắc chắn có khoảng cách hiệu năng lớn về các công cụ java regexp khác nhau.

Nhưng có chắc chắn là một vấn đề hiệu suất khi xây dựng một regexp (và có nghĩa là, nếu dữ liệu là đủ lớn, như noted by Jeff Atwood)

Điều duy nhất bạn nên tránh là catastrophic backtracking, tránh tốt hơn khi sử dụng atomic grouping.

Vì vậy, theo mặc định, tôi sẽ sử dụng công cụ java.utils.regexp, trừ khi bạn có nguồn regexp tuân thủ perl cụ thể mà bạn cần sử dụng lại trong chương trình của mình.

Sau đó, tôi sẽ cẩn thận xây dựng regexp tôi định sử dụng.

Nhưng trong nhiệm kỳ của việc lựa chọn một động cơ này hay cách khác ... vì nó has beensaid trong many ...:

  • "làm cho nó hoạt động, làm cho nó nhanh chóng - theo thứ tự mà"
  • hãy cẩn thận của "tối ưu hóa sớm".
3

Như VonC nói, bạn cần phải biết regexps của mình. Nó không làm tổn thương để biên dịch các Regex trước khi KHÁC, chi phí biên dịch regex mỗi lần có thể làm tổn thương hiệu suất tồi tệ.

Đối với một số danh mục, có các thư viện thay thế: http://jint.sourceforge.net/jint.html có thể có hiệu suất tốt hơn. Sau đó, một lần nữa, nó phụ thuộc vào phiên bản của java bạn đang sử dụng.

JDK 1.6 cho thấy độ chín của động cơ regex với các tính năng và hiệu suất tốt được kết hợp.

2

Nhìn chung, gói java.util.regex (không phải "regexp") ít nhất cũng tốt như bất kỳ thư viện regex Java nào khác, bao gồm Jakarta ORO (lib "Perl5Util") của bạn. Ngoài ra, nó hỗ trợ cả các nhóm nguyên tử và các định lượng sở hữu, cả hai đều thấy vô giá khi viết các regex cực nhanh. Nó cũng hỗ trợ các regex và các nhóm thu thập trước khi biên soạn, nhưng tôi nghĩ đó là sự thật của tất cả các thư viện.

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