성능 테스트가 재미 있기 때문에 : ( 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.5788ms) [10K 반복, 5.788E-05ms 당]
- smart-trunc10 8206 틱 경과 (0.8206ms) [10K 반복, 8.206E-05ms / 초]
- stringbuilder10 10557 틱 경과 (1.0557ms) [10K 반복, 0.00010557ms 당]
- concat10 45495 틱 경과 (4.5495ms) [10K 반복, 0.00045495ms 당]
- newstring10 72535 틱 경과 (7.2535ms) [10K 반복, 0.00072535ms]
늦은
- truncate44 8835 틱 경과 (0.8835ms) [10K 반복, 8.835E-05ms 당]
- stringbuilder44 13106 틱 경과 (1.3106ms) [10K 반복, 0.00013106ms 당]
- smart-trunc44 14821 틱 경과 (1.4821ms) [10K 반복, 0.00014821ms 당]
- newstring44 144324 틱 경과 (14.4324ms) [10K 반복, 0.00144324ms 당]
- concat44 174610 틱 경과 (17.461ms) [10K 반복, 0.0017461ms / 초]
너무 오래
- smart-trunc64 6944 틱 경과 (0.6944ms) [10K 반복, 6.944E-05ms 당]
- truncate64 7686 틱 경과 (0.7686ms) [10K 반복, 7.686E-05ms 당]
- stringbuilder64 13314 틱 경과 (1.3314ms) [10K 반복, 0.00013314ms 당]
- newstring64 177481 틱 경과 (17.7481ms) [10K 반복, 0.00177481ms 당]
- concat64 241601 틱 경과 (24.1601ms) [10K 반복, 0.00241601ms 당]