2012-02-21 18 views
10

Tôi có một ứng dụng đang chạy xem các mục trong hàng đợi, sau đó dựa trên các từ khóa nhất định mà một danh mục được áp dụng - sau đó nó được chèn vào cơ sở dữ liệu.Có sử dụng Biểu thức chính quy nhanh hơn IndexOf không?

Tôi đang sử dụng IndexOf để xác định xem có một từ khóa nhất định không.

Đây có phải là cách lý tưởng hoặc liệu RegEX có nhanh hơn không?

Có khoảng 10 mục/giây đang được xử lý.

+6

Bạn nên thử cả hai cách tiếp cận và đo lường những gì là nhanh hơn. Ngoài ra, 10 lần mỗi giây là không có gì, bạn không nên lo lắng về màn trình diễn ở đây. – ken2k

+2

Ngoài ra, chúng tôi cần biết thêm về độ phức tạp tương đối của việc phân tích cú pháp. Nếu bạn cần phải gọi String.IndexOf 10 lần để đạt được hiệu quả tương tự như RegEx, tỷ lệ hiệu suất sẽ khác với nếu nó là 1 cho 1. –

+1

10 mục mỗi giây là gì? Khi nào bạn thực sự bắt đầu quan tâm đến hiệu suất? –

Trả lời

15

Để tìm từ khóa, phương pháp IndexOf nhanh hơn sử dụng cụm từ thông dụng. Cụm từ thông dụng là mạnh mẽ, nhưng sức mạnh của chúng nằm ở tính linh hoạt, không phải tốc độ thô. Họ không đánh bại các phương thức chuỗi tại các phép toán chuỗi đơn giản.

Dù sao, nếu dây không lớn, nó không thực sự quan trọng vì bạn không thường xuyên làm như vậy.

1

Trước hết, với 10 mục/giây, có thể bạn thậm chí không cần nghĩ về hiệu suất.

IndexOf có lẽ nhanh hơn regex trong hầu hết các trường hợp. Đặc biệt là nếu bạn không sử dụng một regex biên dịch trước.

Hiệu suất của nó cũng có thể phụ thuộc vào so sánh chuỗi/văn bản đã chọn. Tôi mong đợi StringComparison.Ordinal là nhanh nhất.

2

Tôi nghi ngờ điều đó - indexOf là một thuật toán rất đơn giản sẽ chỉ tìm kiếm thông qua chuỗi của bạn và trả về lần xuất hiện đầu tiên mà nó tìm thấy.

Regex là một cơ chế phức tạp hơn rất nhiều cần phải được phân tích cú pháp và kiểm tra đối với toàn bộ chuỗi. Nếu chuỗi của bạn là rất lớn, bạn tốt hơn với indexOf.

1

Tại sao không thử nghiệm và đo thời gian trôi qua bằng cách sử dụng lớp System.Diagnostics.Stopwatch? http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Thiết lập đối tượng Đồng hồ bấm giờ trước hoạt động indexOf của bạn và sau đó đo thời gian trôi qua sau đó. Sau đó, hoán đổi indexOf cho một biểu thức chính quy. Cuối cùng, hãy báo cáo lại với những phát hiện của bạn để chúng tôi có thể nhìn thấy chúng!

1

Ít nhất lập trình viên này tìm thấy nó nhanh hơn để hiểu mã sử dụng IndexOf!

Không tiết kiệm được một chút thời gian CPU để biện minh cho thời gian người tiếp theo hiểu mã?

+1

Một regex có thể tìm thấy sự xuất hiện đầu tiên của một chuỗi để mô phỏng 'indexOf' sẽ không đặt bất kỳ lập trình viên nào gặp rắc rối nghiêm trọng nếu anh ta muốn hiểu nó. –

+0

@ FlorianPeschka, đã đồng ý chi phí thấp, nhưng vẫn có chi phí xem xét RegEx. –

+1

RegEx.Match khó hiểu? –

3

Cách duy nhất bạn biết chắc chắn là thử nghiệm nó. Nhưng làm cho một kiến ​​thức đoán nó phụ thuộc vào số lượng từ khóa bạn đang thử nghiệm, độ dài của văn bản, vv Các indexOf có lẽ sẽ giành chiến thắng.

Cách duy nhất bạn biết chắc chắn là viết bài kiểm tra cho kịch bản cụ thể của bạn.

0

Bạn có thể tìm thông tin về truy vấn rất này vào liên kết này: http://ayende.com/blog/2930/regex-vs-string-indexof

Nói tóm lại nó dường như chỉ ra rằng càng lớn searchpattern các RegEx tốt hơn thực hiện tương đối.

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