เนื่องจากการทดสอบประสิทธิภาพเป็นเรื่องสนุก: (ใช้วิธีการขยาย linqpad )
var val = string.Concat(Enumerable.Range(0, 50).Select(i => i % 10));
foreach(var limit in new[] { 10, 25, 44, 64 })
new Perf<string> {
{ "newstring" + limit, n => new string(val.Take(limit).ToArray()) },
{ "concat" + limit, n => string.Concat(val.Take(limit)) },
{ "truncate" + limit, n => val.Substring(0, Math.Min(val.Length, limit)) },
{ "smart-trunc" + limit, n => val.Length <= limit ? val : val.Substring(0, limit) },
{ "stringbuilder" + limit, n => new StringBuilder(val, 0, Math.Min(val.Length, limit), limit).ToString() },
}.Vs();
truncate
วิธีการก็คือ "อย่างมีนัยสำคัญ" ได้เร็วขึ้น #microoptimization
ตอนต้น
- truncate10 5788 ticks ที่ผ่านไป (0.5788 ms) [ใน 10K reps, 5.788E-05 ms ต่อ]
- smart-trunc10 8206 ticks ที่ผ่านไป (0.8206 ms) [ใน 10K reps, 8.206E-05 ms ต่อ]
- stringbuilder10 1,0557 ticks elapsed (1.0557 ms) [ใน 10K reps, 0.00010557 ms ต่อ]
- concat10 45495 ticks ที่ผ่านไป (4.5495 ms) [ใน 10K reps, 0.00045495 ms ต่อ]
- newstring10 72535 ticks ที่ผ่านไป (7.2535 ms) [ใน 10K reps, 0.00072535 ms ต่อ]
สาย
- truncate44 8835 ticks ที่ผ่านไป (0.8835 ms) [ใน 10K reps, 8.835E-05 ms ต่อ]
- stringbuilder44 13106 ticks ที่ผ่านไป (1.3106 ms) [ใน 10K reps, 0.00013106 ms ต่อ]
- smart-trunc44 14821 ticks elapsed (1.4821 ms) [ใน 10K reps, 0.00014821 ms ต่อ]
- newstring44 144324 ticks ที่ผ่านไป (14.4324 ms) [ใน 10K reps, 0.00144324 ms ต่อ]
- concat44 174610 ticks ที่ผ่านไป (17.461 ms) [ใน 10K reps, 0.0017461 ms ต่อ]
นานเกินไป
- smart-trunc64 6944 ticks ที่ผ่านไป (0.6944 ms) [ใน 10K reps, 6.944E-05 ms ต่อ]
- truncate64 7686 ticks ที่ผ่านไป (0.7686 ms) [ใน 10K reps, 7.686E-05 ms ต่อ]
- stringbuilder64 13314 ticks ที่ผ่านไป (1.3314 ms) [ใน 10K reps, 0.00013314 ms ต่อ]
- newstring64 177481 ticks ที่ผ่านไป (17.7481 ms) [ใน 10K reps, 0.00177481 ms ต่อ]
- concat64 241601 ticks ที่ผ่านไป (24.1601 ms) [ใน 10K reps, 0.00241601 ms ต่อ]