パフォーマンステストは楽しいので:( 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ミリ秒)[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ミリ秒)[10K担当者、0.00014821ミリ秒あたり]
- newstring44 144324ティック経過(14.4324ミリ秒)[10K担当者、0.00144324ミリ秒あたり]
- concat44 174610ティック経過(17.461ミリ秒)[10K担当者、0.0017461ミリ秒あたり]
長すぎる
- smart-trunc64 6944ティック経過(0.6944ミリ秒)[10K担当者、6.944E-05ミリ秒あたり]
- 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ミリ秒あたり]