Tại sao không thể sử dụng ngôn ngữ thông thạo trên string
?Cách tốt nhất để chuyển đổi IEnumerable <char> thành chuỗi?
Ví dụ: không có
var x = "asdf1234";
var y = new string(x.TakeWhile(char.IsLetter).ToArray());
phải là một cách tốt hơn để chuyển đổi IEnumerable<char>
-string
?
Dưới đây là một thử nghiệm tôi đã thực hiện:
class Program
{
static string input = "asdf1234";
static void Main()
{
Console.WriteLine("1000 times:");
RunTest(1000, input);
Console.WriteLine("10000 times:");
RunTest(10000,input);
Console.WriteLine("100000 times:");
RunTest(100000, input);
Console.WriteLine("100000 times:");
RunTest(100000, "ffff57467");
Console.ReadKey();
}
static void RunTest(int times, string input)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < times; i++)
{
string output = new string(input.TakeWhile(char.IsLetter).ToArray());
}
sw.Stop();
var first = sw.ElapsedTicks;
sw.Restart();
for (int i = 0; i < times; i++)
{
string output = Regex.Match(input, @"^[A-Z]+",
RegexOptions.IgnoreCase).Value;
}
sw.Stop();
var second = sw.ElapsedTicks;
var regex = new Regex(@"^[A-Z]+",
RegexOptions.IgnoreCase);
sw.Restart();
for (int i = 0; i < times; i++)
{
var output = regex.Match(input).Value;
}
sw.Stop();
var third = sw.ElapsedTicks;
double percent = (first + second + third)/100;
double p1 = (first/percent)/ 100;
double p2 = (second/percent)/100;
double p3 = (third/percent )/100;
Console.WriteLine("TakeWhile took {0} ({1:P2}).,", first, p1);
Console.WriteLine("Regex took {0}, ({1:P2})." , second,p2);
Console.WriteLine("Preinstantiated Regex took {0}, ({1:P2}).", third,p3);
Console.WriteLine();
}
}
Kết quả:
1000 times:
TakeWhile took 11217 (62.32%).,
Regex took 5044, (28.02%).
Preinstantiated Regex took 1741, (9.67%).
10000 times:
TakeWhile took 9210 (14.78%).,
Regex took 32461, (52.10%).
Preinstantiated Regex took 20669, (33.18%).
100000 times:
TakeWhile took 74945 (13.10%).,
Regex took 324520, (56.70%).
Preinstantiated Regex took 172913, (30.21%).
100000 times:
TakeWhile took 74511 (13.77%).,
Regex took 297760, (55.03%).
Preinstantiated Regex took 168911, (31.22%).
Kết luận: Tôi nghi ngờ những gì tốt hơn để thích, tôi nghĩ rằng tôi sẽ đi trên TakeWhile
đó là chỉ chạy chậm nhất trong lần chạy đầu tiên.
Dù sao, câu hỏi của tôi là nếu có cách nào để tối ưu hóa hiệu suất bằng cách đặt lại kết quả của hàm TakeWhile
.
Vui lòng giải thích ý bạn là "tốt nhất": Nhanh nhất? Đói đói nhất? Dễ hiểu nhất? – LukeH
@LukeH Tôi đã đưa ra quyết định về những gì cần chọn: các cuộc thi đấu. Câu hỏi của tôi là nếu có một cách đẹp hơn 'chuỗi mới (x.TakeWhile (p) .ToArray)' – Shimmy
@LukeH: Có thể muốn lấy lại giải pháp của bạn: Nó nhanh hơn tôi bằng một lề rất lớn – BrokenGlass