因为性能测试很有趣:(使用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
方法“明显”更快。#微优化
早期的
- truncate10 经过 5788 个刻度(0.5788 毫秒)[以 10K 次重复,每次 5.788E-05 毫秒]
- smart-trunc10 8206 个滴答经过 (0.8206 ms) [以 10K 次重复,每次 8.206E-05 ms]
- stringbuilder10 经过 10557 个滴答声(1.0557 毫秒)[以 10K 次重复,每次 0.00010557 毫秒]
- concat10 45495 个滴答经过(4.5495 毫秒)[以 10K 次重复,每 0.00045495 毫秒]
- newstring10 72535 个滴答经过(7.2535 毫秒)[以 10K 次重复,每 0.00072535 毫秒]
晚的
- truncate44 经过 8835 个刻度(0.8835 毫秒)[以 10K 次重复,每次 8.835E-05 毫秒]
- stringbuilder44 13106 个滴答经过(1.3106 毫秒)[以 10K 次重复,每 0.00013106 毫秒]
- smart-trunc44 14821 个滴答经过 (1.4821 ms) [in 10K reps, 0.00014821 ms per]
- newstring44 144324 个滴答经过(14.4324 毫秒)[以 10K 次重复,每 0.00144324 毫秒]
- concat44 174610 个滴答经过(17.461 毫秒)[以 10K 次重复,每 0.0017461 毫秒]
太长
- smart-trunc64 6944 个滴答经过 (0.6944 ms) [in 10K reps, 6.944E-05 ms per]
- truncate64 7686 滴答经过(0.7686 毫秒)[以 10K 次重复,每次 7.686E-05 毫秒]
- stringbuilder64 13314 个滴答经过(1.3314 毫秒)[以 10K 次重复,每 0.00013314 毫秒]
- newstring64 177481 个滴答经过(17.7481 毫秒)[以 10K 次重复,每 0.00177481 毫秒]
- concat64 241601 滴答经过(24.1601 毫秒)[以 10K 次重复,每 0.00241601 毫秒]