Я создал небольшое консольное приложение для тестирования на C # с помощью класса System.Diagnostics.StopWatch, чтобы узнать, сколько времени занимает 3 метода:
Как запустить тест:
public void Run()
{
Stopwatch sw = new Stopwatch();
sw.Start();
InitDirectly();
sw.Stop();
Console.WriteLine($"InitDirectly: {sw.Elapsed.TotalMilliseconds}ms");
sw.Reset();
sw.Start();
InitWithAdd();
sw.Stop();
Console.WriteLine($"InitWithAdd: {sw.Elapsed.TotalMilliseconds}ms");
sw.Reset();
sw.Start();
InitWithForLoop();
sw.Stop();
Console.WriteLine($"InitWithForLoop: {sw.Elapsed.TotalMilliseconds}ms");
}
Метод 1:
private void InitListDirectly()
{
var list = new List<string>() {
"string",
"string",
"string",
//... up to a 100th entry
};
}
Метод 2:
private void InitListViaAdd()
{
var list = new List<string>();
list.Add("string");
list.Add("string");
list.Add("string");
//... up to a 100th entry
}
Метод 3:
private void InitListViaForLoop() {
var list = new List<string>();
for (int i = 0; i < 100; i++) {
list.Add("string");
}
}
Теперь запустите секундомер перед способом 1, затем остановите.То же самое для метода 2.
- Метод 1 занял ~ 0,800 мс
- Метод 2 занял ~ 1 000 мс
- Метод 3 занял ~ 0,120 мс
Теперь я удивлен, что цикл for (метод 3) намного быстрее.Я ожидал, что метод 1 будет самым быстрым, поскольку другие два метода должны вызывать «Add (string)», а третий должен создать цикл for.
Почему метод 3 намного быстрее?Это из-за какой-то компиляции?Понимает ли он, что оператор внутри цикла for будет одинаковым для всех его итераций?
EDIT: я работал в режиме отладки.