パフォーマンステストは楽しいので(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ミリ秒)[10K反復で、5.788E-05ミリ秒あたり]
- smart-trunc10 8206ティックの経過(0.8206ミリ秒)[10K反復で、8.206E-05ミリ秒あたり]
- stringbuilder10 10557ティックの経過(1.0557ミリ秒)[1万レップ、0.00010557ミリ秒あたり]
- concat10 45495ティックの経過(4.5495ミリ秒)[1万回で、0.00045495ミリ秒あたり]
- newstring10 72535ティックの経過(7.2535ミリ秒)[10K反復で、0.00072535ミリ秒あたり]
遅い
- truncate44 8835ティックの経過(0.8835ミリ秒)[1万回で8.835E-05ミリ秒]
- stringbuilder44 13106ティックの経過(1.3106ミリ秒)[1万レップ、0.00013106ミリ秒あたり]
- smart-trunc44 14821ティックの経過(1.4821ミリ秒)[10K反復で、0.00014821ミリ秒あたり]
- newstring44 144324ティックの経過(14.4324ミリ秒)[1万レップ、0.00144324ミリ秒あたり]
- concat44 174610ティックの経過(17.461ミリ秒)[10K反復で、0.0017461ミリ秒あたり]
長すぎる
- smart-trunc64 6944ティックの経過(0.6944ミリ秒)[1万回で、6.944E-05ミリ秒あたり]
- truncate64 7686ティックの経過(0.7686ミリ秒)[1万回で7.686E-05ミリ秒]
- stringbuilder64 13314ティックの経過(1.3314ミリ秒)[1万レップ、0.00013314ミリ秒あたり]
- newstring64 177481ティックの経過(17.7481ミリ秒)[10K反復で、0.00177481ミリ秒あたり]
- concat64 241601ティックの経過(24.1601ミリ秒)[1万レップ、0.00241601ミリ秒あたり]