Этот тест, кажется, подтверждает, что доступ к переменным класса быстрее, чем к переменным метода. Почему? - PullRequest
0 голосов
/ 23 февраля 2020

Итак, я написал следующий тестовый код ниже только для ударов. Я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...