Yar*_*veh 33 c# optimization list params
使用params关键字与List作为某些c#函数的输入有什么利弊?
主要是性能考虑因素和其他权衡因素.
Jim*_*mmy 36
params关键字是由C#编译器处理的语法糖.在引擎盖下面,它实际上在转动
void Foo(params object[] a) { ... }
Foo(1,2,"THREE");
Run Code Online (Sandbox Code Playgroud)
成
void Foo(object[] a) { ... }
Foo(new object[] { 1, 2, "THREE" })
Run Code Online (Sandbox Code Playgroud)
从你所询问的性能角度来看,params调用只是更快,因为创建数组比创建List <>要快一些.上面两个片段之间没有性能差异.
Ori*_*rds 24
我个人params在编写函数时使用,这些函数接受另一个程序员提供的大量输入(例如String.Format),以及IEnumerable编写带有计算机提供的数据项列表的函数(例如File.Write).
性能影响可以忽略不计.担心像这样的琐碎事情的表现正是唐纳德克努特在着名的"过早优化是所有邪恶的根源"中所说的.
也就是说,提问者似乎已经注意到了,所以你走了:
1000万次迭代的结果:
params took 308 ms
list took 879 ms
Run Code Online (Sandbox Code Playgroud)
从这些结果我们可以看出params数组的速度快了两倍.一个简单的事实,你可以在一秒钟之内调用这些东西千万次,这意味着你完全在浪费你的时间而担心它.使用最适合您代码的任何内容.
测试它的代码(使用VS2008在发布模式下编译和运行)
class Program
{
const int COUNT = 10000000;
static IEnumerable<string> m_value = null;
static void ParamsMethod(params string[] args)
{ m_value = args; } // do something with it to stop the compiler just optimizing this method away
static void ListMethod(List<string> args)
{ m_value = args; } // do SOMETHING with it to stop the compiler just optimizing this method away
static void Main(string[] args)
{
var s = new Stopwatch();
s.Start();
for (int i = 0; i < COUNT; ++i)
ParamsMethod("a", "b", "c");
Console.WriteLine("params took {0} ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();
for (int i = 0; i < COUNT; ++i)
ListMethod(new List<string> { "a", "b", "c" });
Console.WriteLine("list took {0} ms", s.ElapsedMilliseconds);
}
}
Run Code Online (Sandbox Code Playgroud)