1. ホーム
  2. c#

[解決済み] 文字列の補間とString.Formatの比較

2022-06-13 13:05:42

質問

文字列補間を使用した場合、顕著な性能差はありますか?

myString += $"{x:x2}";

vs String.Format()?

myString += String.Format("{0:x2}", x);

私は、Resharper が修正を促しているので聞いているだけで、以前騙されたことがあります。

どのように解決するのですか?

答えはイエスでもありノーでもあります。 ReSharper を表示しないことで、あなたを騙しているのです。 第三 の変種を表示しないことで誤魔化しています。リストされた 2 つの変種は同じ IL コードを生成しますが、次のものは確かにブーストを与えるでしょう。

myString += $"{x.ToString("x2")}";

フルテストコード

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Diagnostics.Windows;
using BenchmarkDotNet.Running;

namespace StringFormatPerformanceTest
{
    [Config(typeof(Config))]
    public class StringTests
    {
        private class Config : ManualConfig
        {
            public Config() => AddDiagnoser(MemoryDiagnoser.Default, new EtwProfiler());
        }

        [Params(42, 1337)]
        public int Data;

        [Benchmark] public string Format() => string.Format("{0:x2}", Data);
        [Benchmark] public string Interpolate() => $"{Data:x2}";
        [Benchmark] public string InterpolateExplicit() => $"{Data.ToString("x2")}";
    }

    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<StringTests>();
        }
    }
}

テスト結果

|              Method | Data |      Mean |  Gen 0 | Allocated |
|-------------------- |----- |----------:|-------:|----------:|
|              Format |   42 | 118.03 ns | 0.0178 |      56 B |
|         Interpolate |   42 | 118.36 ns | 0.0178 |      56 B |
| InterpolateExplicit |   42 |  37.01 ns | 0.0102 |      32 B |
|              Format | 1337 | 117.46 ns | 0.0176 |      56 B |
|         Interpolate | 1337 | 113.86 ns | 0.0178 |      56 B |
| InterpolateExplicit | 1337 |  38.73 ns | 0.0102 |      32 B |

InterpolateExplicit() メソッドはより高速になりました。 string . を使う必要がありません。 ボックス オブジェクト を整形します。Boxingは確かに非常にコストがかかります。また、アロケーションを少し減らしたことにも注目です。