什么分配更多,装箱参数或参数数组?

What allocates more, boxing paramaters or params array?

以下哪个调用分配的垃圾更多?

void LogParams(string format, params object[] args)
{
}

void LogArgs(string format, object arg0, object arg1, object arg2)
{
}

LogParams("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry");
LogArgs("Hello, {0}, {1}, {2}", "Tom", "Dick", "Harry");

后台正在研究如何优化最终归结为 string.Format() 调用的日志消息,但是许多日志消息本质上只是将字符串连接在一起。

首先,不涉及装箱,因为 string 不是值类型。

第一种方法占用更多内存,因为必须创建一个包含三个元素的数组(每个字符串引用一个)。然后,创建每个字符串并将引用分配给数组。在调用该方法之前,数组引用被压入堆栈。

对于另一种方法,只在堆上创建三个字符串。在调用方法之前将引用直接压入堆栈。

你基本上是在堆栈上保存 space 而不是在堆上保存 space。但是创建数组的成本更高(因为它是额外的)。