Tôi đã đi xác minh vấn đề này. Thật ngạc nhiên khi phát hiện ra trong các bài kiểm tra bẩn của tôi rằng tùy chọn thứ 2 thậm chí còn nhanh hơn một chút.
namespace Test
{
class Foreach
{
string[] names = new[] { "ABC", "MNL", "XYZ" };
void Method1()
{
List<User> list = new List<User>();
User u;
foreach (string s in names)
{
u = new User();
u.Name = s;
list.Add(u);
}
}
void Method2()
{
List<User> list = new List<User>();
foreach (string s in names)
{
User u = new User();
u.Name = s;
list.Add(u);
}
}
}
public class User { public string Name; }
}
Tôi đã xác minh CIL nhưng nó không giống hệt nhau.
Vì vậy, tôi đã chuẩn bị một thứ gì đó mà tôi muốn để làm bài thi tốt hơn nhiều.
namespace Test
{
class Loop
{
public TimeSpan method1 = new TimeSpan();
public TimeSpan method2 = new TimeSpan();
Stopwatch sw = new Stopwatch();
public void Method1()
{
sw.Restart();
C c;
C c1;
C c2;
C c3;
C c4;
int i = 1000;
while (i-- > 0)
{
c = new C();
c1 = new C();
c2 = new C();
c3 = new C();
c4 = new C();
}
sw.Stop();
method1 = method1.Add(sw.Elapsed);
}
public void Method2()
{
sw.Restart();
int i = 1000;
while (i-- > 0)
{
var c = new C();
var c1 = new C();
var c2 = new C();
var c3 = new C();
var c4 = new C();
}
sw.Stop();
method2 = method2.Add(sw.Elapsed);
}
}
class C { }
}
Cũng trong trường hợp này, phương pháp thứ 2 luôn thắng nhưng sau đó tôi xác minh CIL thì không thấy khác biệt.
Tôi không phải là chuyên gia đọc CIL nhưng tôi không thấy vấn đề gì về sự suy giảm. Như đã được chỉ ra, tuyên bố không phải là phân bổ vì vậy không có hình phạt về hiệu suất trên đó.
Kiểm tra
namespace Test
{
class Foreach
{
string[] names = new[] { "ABC", "MNL", "XYZ" };
public TimeSpan method1 = new TimeSpan();
public TimeSpan method2 = new TimeSpan();
Stopwatch sw = new Stopwatch();
void Method1()
{
sw.Restart();
List<User> list = new List<User>();
User u;
foreach (string s in names)
{
u = new User();
u.Name = s;
list.Add(u);
}
sw.Stop();
method1 = method1.Add(sw.Elapsed);
}
void Method2()
{
sw.Restart();
List<User> list = new List<User>();
foreach (string s in names)
{
User u = new User();
u.Name = s;
list.Add(u);
}
sw.Stop();
method2 = method2.Add(sw.Elapsed);
}
}
public class User { public string Name; }