값 유형 및 참조 유형 목록에 액세스 할 때 a for
와 a 를 사용하는 차이를 측정하려고했습니다 foreach
.
다음 클래스를 사용하여 프로파일 링을 수행했습니다.
public static class Benchmarker
{
public static void Profile(string description, int iterations, Action func)
{
Console.Write(description);
// Warm up
func();
Stopwatch watch = new Stopwatch();
// Clean up
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
watch.Start();
for (int i = 0; i < iterations; i++)
{
func();
}
watch.Stop();
Console.WriteLine(" average time: {0} ms", watch.Elapsed.TotalMilliseconds / iterations);
}
}
double
내 가치 유형에 사용 했습니다. 그리고 참조 유형을 테스트하기 위해이 '가짜 클래스'를 만들었습니다.
class DoubleWrapper
{
public double Value { get; set; }
public DoubleWrapper(double value)
{
Value = value;
}
}
마지막으로이 코드를 실행하고 시간 차이를 비교했습니다.
static void Main(string[] args)
{
int size = 1000000;
int iterationCount = 100;
var valueList = new List<double>(size);
for (int i = 0; i < size; i++)
valueList.Add(i);
var refList = new List<DoubleWrapper>(size);
for (int i = 0; i < size; i++)
refList.Add(new DoubleWrapper(i));
double dummy;
Benchmarker.Profile("valueList for: ", iterationCount, () =>
{
double result = 0;
for (int i = 0; i < valueList.Count; i++)
{
unchecked
{
var temp = valueList[i];
result *= temp;
result += temp;
result /= temp;
result -= temp;
}
}
dummy = result;
});
Benchmarker.Profile("valueList foreach: ", iterationCount, () =>
{
double result = 0;
foreach (var v in valueList)
{
var temp = v;
result *= temp;
result += temp;
result /= temp;
result -= temp;
}
dummy = result;
});
Benchmarker.Profile("refList for: ", iterationCount, () =>
{
double result = 0;
for (int i = 0; i < refList.Count; i++)
{
unchecked
{
var temp = refList[i].Value;
result *= temp;
result += temp;
result /= temp;
result -= temp;
}
}
dummy = result;
});
Benchmarker.Profile("refList foreach: ", iterationCount, () =>
{
double result = 0;
foreach (var v in refList)
{
unchecked
{
var temp = v.Value;
result *= temp;
result += temp;
result /= temp;
result -= temp;
}
}
dummy = result;
});
SafeExit();
}
나는 선택 Release
하고 Any CPU
옵션을 선택 하고 프로그램을 실행하고 다음과 같은 시간을 얻었습니다.
valueList for: average time: 483,967938 ms
valueList foreach: average time: 477,873079 ms
refList for: average time: 490,524197 ms
refList foreach: average time: 485,659557 ms
Done!
그런 다음 릴리스 및 x64 옵션을 선택하고 프로그램을 실행하고 다음과 같은 시간을 얻었습니다.
valueList for: average time: 16,720209 ms
valueList foreach: average time: 15,953483 ms
refList for: average time: 19,381077 ms
refList foreach: average time: 18,636781 ms
Done!
x64 비트 버전이 훨씬 빠른 이유는 무엇입니까? 나는 약간의 차이를 예상했지만 그렇게 큰 것은 아닙니다.
다른 컴퓨터에 액세스 할 수 없습니다. 당신의 컴퓨터에서 이것을 실행하고 결과를 알려주시겠습니까? Visual Studio 2015를 사용하고 있으며 Intel Core i7 930이 있습니다.
SafeExit()
방법 은 다음과 같습니다 . 혼자서 컴파일 / 실행할 수 있습니다.
private static void SafeExit()
{
Console.WriteLine("Done!");
Console.ReadLine();
System.Environment.Exit(1);
}
요청한대로 double?
내 대신 사용 DoubleWrapper
:
모든 CPU
valueList for: average time: 482,98116 ms
valueList foreach: average time: 478,837701 ms
refList for: average time: 491,075915 ms
refList foreach: average time: 483,206072 ms
Done!
x64
valueList for: average time: 16,393947 ms
valueList foreach: average time: 15,87007 ms
refList for: average time: 18,267736 ms
refList foreach: average time: 16,496038 ms
Done!
마지막으로 중요한 점 : x86
프로필을 만들면Any CPU
.