由于性能测试很有趣:(使用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个滴答声(0.5788 ms)[以1万次重复,每个5.788E-05 ms]
- smart-trunc10过去了8206个滴答声(0.8206毫秒)[以10K代表,每个8.206E-05毫秒]
- stringbuilder10经过10557个滴答声(1.0557 ms)[以10K代表,每个0.00010557 ms]
- concat10经过45495个滴答声(4.5495 ms)[以1万次代表,每个0.00045495 ms]
- newstring10经过72535个滴答声(7.2535毫秒)[以1万次代表,每个0.00072535毫秒]
晚了
- truncate44经过8835个滴答声(0.8835毫秒)[以10K代表,每个8.835E-05毫秒]
- stringbuilder44经过13106个滴答声(1.3106毫秒)[以1万次代表,每个0.00013106毫秒]
- smart-trunc44经过14821个滴答声(1.4821 ms)[以10K代表,每个0.00014821 ms]
- newstring44经过144324个滴答声(14.4324 ms)[以10K代表,每个0.00144324 ms]
- concat44 174610滴答已过去(17.461毫秒)[以1万次代表,每0.0017461毫秒]
太长
- smart-trunc64经过6944个滴答声(0.6944毫秒)[以10K代表,每个6.944E-05毫秒]
- truncate64经过7686次滴答(0.7686毫秒)[以1万次重复,每7.686E-05毫秒]
- stringbuilder64经过13314滴答声(1.3314毫秒)[以10K代表,每0.00013314毫秒]
- newstring64经过177481个滴答声(17.7481毫秒)[以1万次代表,每个0.00177481毫秒]
- concat64 241601滴答已过去(24.1601 ms)[以1万次代表,每0.00241601 ms]