Итак, я написал следующий тестовый код ниже только для ударов. Я использую VS 2017, установил версию фреймворка на 4.7.2 и установил флажок «оптимизировать код» при компиляции для «Release».
Каждый раз, когда я запускаю код, метод, который обращается к классу Переменные работают быстрее, чем метод, который имеет их в качестве переменных метода.
Я думал, что последний будет работать быстрее, поскольку все это должно быть в стеке, а не в куче.
Что-то не так с моим тестовым кодом? Или почему это так?
stati c void Main (string [] args) {
private static double _theClassVariableForTheMethodParameterVsClassVariableSpeedTest = 13.0;
private static int _numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest = 100;
_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest = 100;
TestClassMemberVariableVsMethodParameterMethodParameter(_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest, _theClassVariableForTheMethodParameterVsClassVariableSpeedTest);
TestClassMemberVariableVsMethodParameterClassVariable();
_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest = 10000;
TestClassMemberVariableVsMethodParameterMethodParameter(_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest, _theClassVariableForTheMethodParameterVsClassVariableSpeedTest);
TestClassMemberVariableVsMethodParameterClassVariable();
_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest = 1000000;
TestClassMemberVariableVsMethodParameterMethodParameter(_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest, _theClassVariableForTheMethodParameterVsClassVariableSpeedTest);
TestClassMemberVariableVsMethodParameterClassVariable();
_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest = 100000000;
TestClassMemberVariableVsMethodParameterMethodParameter(_numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest, _theClassVariableForTheMethodParameterVsClassVariableSpeedTest);
TestClassMemberVariableVsMethodParameterClassVariable();
}
#region ClassMemberVariableVsMethodParameter
static void TestClassMemberVariableVsMethodParameterMethodParameter(int numberOfComparisons, double theMethodParamNumber)
{
Console.WriteLine("######## " + System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine("Number of comparisons: " + numberOfComparisons.ToString("#,##0"));
Stopwatch sw = new Stopwatch();
DateTime end = DateTime.Now;
DateTime start = DateTime.Now;
double totalSum = 0;
Thread.Sleep(500);
Console.WriteLine("###########################################################");
Console.WriteLine("Starting MethodParameterAccess test with " + numberOfComparisons.ToString("#,##0") + " at: " + DateTime.Now.ToLongTimeString());
sw.Restart();
for (int x = 0; x < numberOfComparisons; x++)
{
totalSum += theMethodParamNumber;
}
sw.Stop();
Console.WriteLine("Finished at: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("Time to run: " + sw.Elapsed.ToString("mm\\:ss\\.fffffff"));
Console.WriteLine("Sum is: " + totalSum.ToString("#,##0"));
Thread.Sleep(500);
Console.WriteLine();
}
static void TestClassMemberVariableVsMethodParameterClassVariable()
{
Console.WriteLine("######## " + System.Reflection.MethodBase.GetCurrentMethod().Name);
Console.WriteLine("Number of comparisons: " + _numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest.ToString("#,##0"));
Stopwatch sw = new Stopwatch();
DateTime end = DateTime.Now;
DateTime start = DateTime.Now;
double totalSum = 0;
Thread.Sleep(500);
Console.WriteLine("###########################################################");
Console.WriteLine("Starting Class Variable Access test with " + _numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest.ToString("#,##0") + " at: " + DateTime.Now.ToLongTimeString());
sw.Restart();
for (int x = 0; x < _numberOfComparisonsForTheMethodParameterVsClassVariableSpeedTest; x++)
{
totalSum += _theClassVariableForTheMethodParameterVsClassVariableSpeedTest;
}
sw.Stop();
Console.WriteLine("Finished at: " + DateTime.Now.ToLongTimeString());
Console.WriteLine("Time to run: " + sw.Elapsed.ToString("mm\\:ss\\.fffffff"));
Console.WriteLine("Sum is: " + totalSum.ToString("#,##0"));
Thread.Sleep(500);
Console.WriteLine();
}
#endregion
Вот примеры результатов от одного из пробегов, которые я сделал. Обратите внимание, что все вызовы методов с параметрами выполняются медленнее, чем те, которые ссылаются на переменные класса. Я сделал это примерно полдюжины раз, и все прогоны имеют схожие результаты:
## TestClassMemberVariableVsMethodParameterMethodParameter Количество сравнений: 100 ################## ################################### Запуск теста MethodParameterAccess с 100 в 7:51:44 Завершено в :
7: 51: 44 PM Время выполнения: 00: 00.0000026 Сумма: 1300
## TestClassMemberVariableVsMethodParameterClassVariable Количество сравнений: 100 ################## ################################### Запуск теста доступа к переменным классам со значением 100 в 7:51:45 PM Закончено в:
7: 51: 45. Время выполнения: 00: 00.0000005 Сумма: 1300
## TestClassMemberVariableVsMethodParameterMethodParameter Количество сравнений: 10 000 ################ ##################################### Запуск теста MethodParameterAccess с 10 000 в 7:51:46 PM Завершено в:
7: 51: 46 PM. Время выполнения: 00: 00.0000285. Сумма: 130 000
## TestClassMemberVariableVsMethodParameterClassVariable. Арисон: 10 000 ##################################################### ###### Стартовый тест доступа к переменной класса с 10 000 в 7:51:47. Окончание:
7: 51: 47. Время выполнения: 00: 00.0000276. Сумма: 130 000
## TestClassMemberVariableVsMethodParameterMethodParameter Количество сравнений: 1 000 000 ################################################### ######## Запуск теста MethodParameterAccess с 1 000 000 в 7:51:48. Окончание:
7: 51: 48. Время запуска: 00: 00.0034285. Сумма: 13 000 000
## TestClassMemberVariableVsMethodParameterClassVariable Количество сравнений: 1 000 000 ################################################### ######## Начальный тест доступа к переменным классам с 1 000 000 в 7:51:49. Окончание:
7: 51: 49. Время запуска: 00: 00.0028730. Сумма: 13 000 000
# # TestClassMemberVariableVsMethodParameterMethodParameter Количество сравнений: 100 000 000 ########## Запуск теста MethodParameterAccess с 100 000 000 a t: 7:51:50 PM Завершено
в: 7:51:50 PM Время выполнения: 00: 00.3210571 Сумма: 1 300 000 000
## TestClassMemberVariableVsMethodParameterClassVariable Количество сравнений: 100 000 000 ######## ################################################### Стартовый тест доступа к переменным классам с 100 000 000 в 7:51:51 PM Закончено
в 7:51:51 PM Время запуска: 00: 00.3205412 Сумма: 1 300 000 000