2010-04-05 31 views
6

bằng văn bản một động cơ kịch bản, tôi có chức năng tương tự (psuedo-code)Regex so sánh thủ công. Cái nào nhanh hơn?

function is_whitespace?(char c){ 
    return c==' ' || c=='\t' || c=='\r' || c=='\n'; 
} 

Vâng, câu hỏi của tôi là có tốc độ nhanh nhất trong langugaes? Điều đó hoặc sử dụng regex như

function is_whitespace?(char c){ 
    return regex_match('\s',c); 
} 

Ngôn ngữ chính tôi quan tâm là C#, C và Ruby trong trường hợp hoàn toàn phụ thuộc vào nền tảng.

+2

Dường như đủ đơn giản để thực hiện một bài kiểm tra nhanh để tìm hiểu. Tạo ra một tập tin đầy đủ các ký tự ngẫu nhiên và vượt qua nó thông qua cả hai chức năng. –

+0

Tôi nghĩ bạn có nghĩa là '\ s' thay vì '\ w' ở đó. – sepp2k

+0

yea, đó là sự thật .. Mono sẽ phải đủ cho thử nghiệm C# mặc dù .. – Earlz

Trả lời

11

Tất nhiên bốn so sánh các khối bộ nhớ nhỏ nhanh hơn rất nhiều (và sử dụng gần như không có bộ nhớ) hơn là xây dựng, chạy và phá hủy một máy trạng thái.

+0

+1. Lưu ý rằng các ví dụ phức tạp hơn cũng có thể nhanh hơn để sử dụng regex. –

+0

Vâng, khi nào Regex đánh bại các so sánh thủ công (ngây thơ)? – Earlz

+3

Tôi đoán là không bao giờ, nhưng để viết tay một người đấu thầu cho một ngôn ngữ thông thường có thể trở nên rất phức tạp so với việc viết một regex. – danben

1

Trong hầu hết các trường hợp, regex để tìm một thứ giống ký tự khoảng trắng rất nhanh. Bạn có nhiều nhãn cầu nhìn vào hiệu suất trong việc triển khai regex hàng đầu và có thể có các khu vực khác của 'trái cây treo thấp' để tối ưu hóa ở các khu vực khác trong mã của bạn.

Các khu vực có hiệu suất kém của regex là một regex kém bằng văn bản. Lời khuyên là để tránh nhiều backtracking không cần thiết, nhóm và thay đổi càng tốt. Sử dụng một cái gì đó như "Regex Buddy" hoặc Perl với "sử dụng lại gỡ lỗi" để xem có bao nhiêu chi nhánh regex của bạn mất.

Các liên kết đến một số vấn đề về hiệu suất regex.

Nếu nghi ngờ, làm timings so sánh ...

Coding Horor- Regex

Java Performance - Regex

3

Việc so sánh thủ công là nhanh hơn để thực hiện, so sánh regex là nhanh hơn để gõ.

Lưu ý rằng hai triển khai của bạn không tương đương nếu hệ thống của bạn sử dụng Unicode. Regex \s phù hợp với tất cả khoảng trắng Unicode trong khi so sánh thủ công của bạn chỉ xử lý ASCII cơ bản và thậm chí không bao gồm tab dọc và các ký tự cấp dữ liệu biểu mẫu thường được coi là khoảng trắng.

Nếu bạn đang viết điều này bằng ngôn ngữ cấp cao, tôi khuyên bạn nên sử dụng hàm is_whitespace() đã được cung cấp bởi thư viện ngôn ngữ lập trình của bạn. Một chức năng cơ bản như vậy hầu như luôn được bao gồm.

Vì vậy, cuối cùng câu trả lời là "nó phụ thuộc". Trong một số trường hợp, nỗ lực lập trình bổ sung của việc sử dụng mã thủ tục được đảm bảo. Trong nhiều trường hợp, regex đủ nhanh và dễ bảo trì hơn.

+0

Điều đó không phụ thuộc vào mặc dù việc thực hiện Regex của bạn có nhận biết unicode hay không? (và ngôn ngữ của bạn. Ví dụ, tôi nghĩ Ruby vẫn không nhận thức được unicode) – Earlz

+0

Tôi đã nói: "nếu hệ thống của bạn sử dụng Unicode". Với điều đó tôi có nghĩa là cả ngôn ngữ lập trình và hương vị regex. Các hương vị regex trong Ruby 1.8 không hỗ trợ Unicode, một trong Ruby 1.9. –

1

sau khi sử dụng đĩa, regex hầu như luôn là nút cổ chai hiệu suất của tôi khi tôi cấu hình mã của mình. ngay cả đối với những thứ đơn giản như .split ("").

0

Tôi không thể nói về C# hoặc C, nhưng tôi không cho rằng biểu mẫu không phải regex nhanh hơn trong Ruby.

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