字符串格式化测试
July 22, 2021About 1 min
字符串格式化测试
我们知道使用字符串优化的方式,就是尽量使用StringBuilder
来处理需要经常修改的字符串。但是我们平时用到字符串格式化的时候呢?我做了一个测试。
测试代码
我们使用 StringBuilder
、Static StringBuilder
、$
、string.Format
,分别调用100000 Format
次查看profile。
测试代码
public class ProfileTest : MonoBehaviour
{
private System.Text.StringBuilder _sb = new System.Text.StringBuilder();
private const string kFormator = "2222 {0}";
private string _test = string.Empty;
private void OnGUI()
{
if (GUILayout.Button("GC Collect"))
{
System.GC.Collect();
}
if (GUILayout.Button("StringBuilder"))
{
for (int i = 0; i < 100000; i++)
{
_sb.Clear();
_sb.Length = 0;
_sb.AppendFormat("in {0}", i);
_test = _sb.ToString();
}
UnityEditor.EditorApplication.isPaused = true;
}
if (GUILayout.Button("StringBuilder Const"))
{
for (int i = 0; i < 100000; i++)
{
_sb.Clear();
_sb.Length = 0;
_sb.AppendFormat(kFormator, i);
_test = _sb.ToString();
}
UnityEditor.EditorApplication.isPaused = true;
}
if (GUILayout.Button("Insert"))
{
for (int i = 0; i < 100000; i++)
{
_test = $"sssss{i}";
}
UnityEditor.EditorApplication.isPaused = true;
}
if (GUILayout.Button("Format"))
{
for (int i = 0; i < 100000; i++)
{
_test = string.Format("sss {0}", i);
}
UnityEditor.EditorApplication.isPaused = true;
}
if (GUILayout.Button("Format Const"))
{
for (int i = 0; i < 100000; i++)
{
_test = string.Format(kFormator, i);
}
UnityEditor.EditorApplication.isPaused = true;
}
}
}
测试截图
StringBuilder

StringBuilder Const

Interpolation

String Format

String Format Const

测试结论
Test | GC Alloc | Time ms | Self ms |
---|---|---|---|
StringBuilder | 9.3MB | 2235.08 | 59.78 |
StringBuilder Const | 9.7MB | 2282.98 | 61.95 |
Interpolation | 9.7MB | 2371.47 | 34.99 |
String Format | 9.5MB | 2368.92 | 34.66 |
String Format Const | 9.7MB | 2404.02 | 35.21 |
我们看到最后一个数据Unity调用的花去的时间,直接使用格式化或者内插花去的时间少于StringBuilder
花的时间少一半。但是所有的时间其实差距不是特别大。再从分配堆内存中看StringBuilder
最少,但是差距也不是特别大。
所以:
- 最求极致就使用
StringBuilder
- 一般直接使用
string.Format