Bất kỳ suy nghĩ nào về hiệu quả của việc này? ...Cách nhanh nhất để đếm số ký tự viết hoa trong C#
CommentText.ToCharArray().Where(c => c >= 'A' && c <= 'Z').Count()
Bất kỳ suy nghĩ nào về hiệu quả của việc này? ...Cách nhanh nhất để đếm số ký tự viết hoa trong C#
CommentText.ToCharArray().Where(c => c >= 'A' && c <= 'Z').Count()
Ok, chỉ cần gõ lên một số mã để thời gian phương pháp của bạn chống lại điều này:
int count = 0;
for (int i = 0; i < s.Length; i++)
{
if (char.IsUpper(s[i])) count++;
}
Kết quả:
Yours: 19.737 ve
Mine: 118 ticks
chênh lệch khá lớn! Đôi khi cách thẳng tiến nhất là hiệu quả nhất.
Sửa
Chỉ cần ra quan tâm, này:
int count = s.Count(c => char.IsUpper(c));
Đi kèm ở vào khoảng 2500 ve. Vì vậy, đối với một "Linqy" một lớp lót nó khá nhanh chóng.
Thậm chí không cần thử nghiệm tôi muốn nói
int count = 0;
foreach (char c in commentText)
{
if (Char.IsUpper(c))
count++;
}
là nhanh hơn, ngoài khơi tại để kiểm tra nó.
Đúng là ngang bằng (hoặc thậm chí là một vài bọ ve nhanh hơn) so với vòng lặp "for" của tôi. –
Không bận tâm để kiểm tra nó, như Matt Hamilton đã chu đáo đủ để làm điều này cho tôi :) –
Trước tiên, không có lý do nào bạn cần gọi ToCharArray()
vì, giả sử CommentText
là một chuỗi đã là IEnumerable<char>
. Thứ hai, có lẽ bạn nên gọi số char.IsUpper
thay vì giả sử bạn chỉ xử lý các giá trị ASCII. Mã này thực sự sẽ giống như thế,
CommentText.Count(char.IsUpper)
Thứ ba, nếu bạn đang lo lắng về tốc độ không có nhiều đến nỗi có thể đánh bại cái cũ cho vòng lặp,
int count = 0;
for (int i = 0; i < CommentText.Length; i++)
if (char.IsUpper(CommentText[i]) count++;
Nói chung, gọi phương thức bất kỳ đang diễn ra chậm hơn so với nội tuyến mã nhưng loại tối ưu hóa này chỉ nên được thực hiện nếu bạn hoàn toàn chắc chắn đây là cổ chai trong mã của bạn.
Việc bạn đang làm với mã đó là tạo bộ sưu tập với các ký tự, sau đó tạo bộ sưu tập mới chỉ chứa các ký tự viết hoa, sau đó chỉ lặp lại bộ sưu tập đó để tìm xem có bao nhiêu.
này sẽ thực hiện tốt hơn (nhưng vẫn không khá tốt như một vòng lặp đơn giản), vì nó không tạo ra những bộ sưu tập trung:
CommentText.Count(c => Char.IsUpper(c))
Edit: Removed cuộc gọi ToCharArray cũng như Matt đề nghị.
+1 để di chuyển biến vị ngữ vào Đếm. Lấy đi ToCharArray là tốt và nó tăng tốc đáng kể. –
Điểm tốt. Tôi đã làm một cái gì đó tương tự trước và sau đó ToCharArray là cần thiết, nhưng không phải trong trường hợp này. :) – Guffa
Tôi đã có này
Regex x = new Regex("[A-Z]{1}",
RegexOptions.Compiled | RegexOptions.CultureInvariant);
int c = x.Matches(s).Count;
nhưng tôi không biết nếu nó đặc biệt nhanh chóng. Nó sẽ không nhận được ký tự đặc biệt trong hai, tôi s'pose
EDIT:
nhanh so với câu trả lời của câu hỏi này. Debug trong vshost, 10'000 lặp với chuỗi:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA
Cảm ơn bạn đã so sánh - Tôi tự hỏi làm thế nào một regex sẽ xếp chồng lên nhau. – peterorum
Bạn có thể kết hợp thành một dòng: 'Regex.Matches (s," [A-Z] {1} ", RegexOptions.Compiled | RegexOptions.CultureInvariant) .Count;' –
+1 giải pháp trường học cũ tốt đẹp :) –
D'oh! Pipped tại bài viết, gần như chính xác cùng một giải pháp. Làm tốt lắm Matt, những ngón tay chậm chạp ngu ngốc. . . –
Nhân tiện, +1 bạn đời, bạn kiếm được nó :) –