Đây là một bài viết cũ của tôi, hầu hết các câu trả lời được chấp nhận là tốt. Tuy nhiên tôi quyết định điểm chuẩn từng giải pháp và một giải pháp rõ ràng khác (chỉ để cho vui). Tôi tự hỏi liệu có sự khác biệt giữa các mẫu regex trên các trình duyệt khác nhau với các chuỗi có kích thước khác nhau.
Vì vậy, về cơ bản tôi đã sử dụng jsPerf trên
- Thử nghiệm trong Chrome 65.0.3325 / Windows 10 0.0.0
- Kiểm tra trong Edge 16.16299.0 / Windows 10 0.0.0
Các mẫu regex tôi đã thử nghiệm là
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
Tôi đã tải chúng lên với độ dài chuỗi ký tự ngẫu nhiên
- dài 5000
- chiều dài 1000
- chiều dài 200
Ví dụ javascript tôi đã sử dụng var newstr = str.replace(/[\W_]+/g," ");
Mỗi lần chạy bao gồm từ 50 mẫu trở lên trên mỗi regex và tôi chạy chúng 5 lần trên mỗi trình duyệt.
Hãy đua ngựa của chúng tôi!
Các kết quả
Chrome Edge
Chars Pattern Ops/Sec Deviation Op/Sec Deviation
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 1.09 10,820.40 1.32
5,000 /[^a-z0-9]+/gi 19,901.60 1.49 10,902.00 1.20
5,000 /[^a-zA-Z0-9]+/g 19,559.40 1.96 10,916.80 1.13
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 1.65 52,358.80 1.41
1,000 /[^a-z0-9]+/gi 97,584.40 1.18 52,105.00 1.60
1,000 /[^a-zA-Z0-9]+/g 96,965.80 1.10 51,864.60 1.76
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 1.70 261,030.40 1.80
200 /[^a-z0-9]+/gi 476,177.80 2.01 261,751.60 1.96
200 /[^a-zA-Z0-9]+/g 486,423.00 0.80 258,774.20 2.15
Sự thật được biết, Regex trong cả hai trình duyệt (có tính đến độ lệch) gần như không thể phân biệt được, tuy nhiên tôi nghĩ rằng nếu nó chạy được điều này thậm chí nhiều lần thì kết quả sẽ trở nên rõ ràng hơn một chút (nhưng không nhiều).
Tỷ lệ lý thuyết cho 1 ký tự
Chrome Edge
Chars Pattern Ops/Sec Scaled Op/Sec Scaled
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 99,889,000 10,820.40 54,102,000
5,000 /[^a-z0-9]+/gi 19,901.60 99,508,000 10,902.00 54,510,000
5,000 /[^a-zA-Z0-9]+/g 19,559.40 97,797,000 10,916.80 54,584,000
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 96,239,000 52,358.80 52,358,800
1,000 /[^a-z0-9]+/gi 97,584.40 97,584,400 52,105.00 52,105,000
1,000 /[^a-zA-Z0-9]+/g 96,965.80 96,965,800 51,864.60 51,864,600
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 96,063,720 261,030.40 52,206,080
200 /[^a-z0-9]+/gi 476,177.80 95,235,560 261,751.60 52,350,320
200 /[^a-zA-Z0-9]+/g 486,423.00 97,284,600 258,774.20 51,754,840
Tôi sẽ không quan tâm nhiều đến những kết quả này vì đây không thực sự là một sự khác biệt đáng kể, tất cả những gì chúng ta thực sự có thể nói là cạnh chậm hơn: o. Ngoài ra, tôi đã rất chán.
Dù sao bạn có thể chạy điểm chuẩn cho chính mình.
Điểm chuẩn Jsperf tại đây