Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Глобальные и локальные переменные, что лучше?

Статус
В этой теме нельзя размещать новые ответы.

MrJunior

Компетентный


  • Вступление.
    Уж слижком часто на всех форумах и группах вк пошли фразы "Обращение к локальным переменным быстрее чем к глобальным" и подобные.
    Как-бы мне казалось логично всё, я верил в то время пока никто не предоставлял никаких тестов или доказательств.
    Сегодня я(как всегда) сделал тесты где решил проверить это(ну вообще идей для кода небыло), результаты ниже.
  • Сами тесты

    Я хотел провести тесты на все виды переменных и массивов(что и сделал): Целые числа, числа с плавающей точкой, bool, массивы(только текстовые) и двухмерные массивы(опять же - текстовые). Результаты пояснили своё. Скрины тестов и коды:
    PHP:
    #include a_samp
    
    new GlobalChar[100] = "GlobalCharText";
    new GlobalInt = 521;
    new Float:GlobalFloat = 385.042;
    new bool:GlobalBool = false;
    new GlobalCharMassive[2][100] =
    {
    	"Testing Text",
    	"Text for testing"
    };
    
    main()
    {
    	print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        new LocalChar[100] = "LocalCharText";
    	new LocalInt = 521;
    	new Float:LocalFloat = 385.042;
    	new bool:LocalBool = false;
    	new LocalCharMassive[2][100] =
    	{
    		"Testing Text",
    		"Text for testing"
    	};
    	
    	new ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    LocalChar = "Changing text";
    	    LocalChar = "LocalCharText";
    		LocalChar = "Testing";
    		LocalChar = "LOLOLOLOLOLO";
    		LocalChar = "Last Changing";
    		LocalChar = "LocalCharText";
    	}
    	printf("\nИзменение локального массива: %d тиков.", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    SendClientMessageToAll(-1, LocalChar);
    	    SendClientMessage(random(MAX_PLAYERS), -1, LocalChar);
    	    format(LocalChar, sizeof(LocalChar), "%s%d%f%b", LocalChar, LocalInt, LocalFloat, LocalBool);
    	    strcat(LocalChar, LocalChar);
    	    strcat(LocalChar, "Doubled xDDDDDD");
    	    LocalChar = "LocalCharText";
    	}
    	printf("Работа с локальным массивом( SendClientMessage(ToAll), format, strcat ): %d тиков\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalChar = "Changing text";
    	    GlobalChar = "LocalCharText";
    		GlobalChar = "Testing";
    		GlobalChar = "LOLOLOLOLOLO";
    		GlobalChar = "Last Changing";
    		GlobalChar = "LocalCharText";
    	}
    	printf("Изменение глобального массива: %d тиков.", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    SendClientMessageToAll(-1, GlobalChar);
    	    SendClientMessage(random(MAX_PLAYERS), -1, GlobalChar);
    	    format(GlobalChar, sizeof(GlobalChar), "%s%d%f%b", GlobalChar, GlobalInt, GlobalFloat, GlobalBool);
    	    strcat(GlobalChar, GlobalChar);
    	    strcat(GlobalChar, "Doubled xDDDDDD");
    	    GlobalChar = "LocalCharText";
    	}
    	printf("Работа с глобальным массивом( SendClientMessage(ToAll), format, strcat ): %d тиков\n\n\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    LocalInt = 231;
            LocalInt = 1243;
            LocalInt = 2434;
            LocalInt = 1497124;
            LocalInt = 23847290;
            LocalInt = 123;
            LocalInt = 12;
            LocalInt = 2;
            LocalInt = 45;
            LocalInt = 521;
    	}
    	printf("Присвоение значений локальной переменной(INT): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    		LocalInt = LocalInt-231;
    		LocalInt = 1000000000-100*100+200*200-10000/100+512;
    		LocalInt = 521;
    		format(LocalChar, sizeof(LocalChar), "%d%d%d%d%d%d%d%d%d%d%d%d", LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt, LocalInt);
    		LocalInt = floatround(123.231);
    		LocalInt = floatround(LocalFloat);
    		LocalInt = floatround(98123.1209);
    		LocalInt = 521;
    		LocalChar = "LocalCharText";
    	}
    	printf("Работа с локальной переменной(INT)( Присвоение, уравнения, format, floatround ): %d тиков\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalInt = 231;
            GlobalInt = 1243;
            GlobalInt = 2434;
            GlobalInt = 1497124;
            GlobalInt = 23847290;
            GlobalInt = 123;
            GlobalInt = 12;
            GlobalInt = 2;
            GlobalInt = 45;
            GlobalInt = 521;
    	}
    	printf("Присвоение значений глобальной переменной(INT): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    		GlobalInt = GlobalInt-231;
    		GlobalInt = 1000000000-100*100+200*200-10000/100+512;
    		GlobalInt = 521;
    		format(LocalChar, sizeof(LocalChar), "%d%d%d%d%d%d%d%d%d%d%d%d", GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt, GlobalInt);
    		GlobalInt = floatround(123.231);
    		GlobalInt = floatround(LocalFloat);
    		GlobalInt = floatround(98123.1209);
    		GlobalInt = 521;
    		LocalChar = "LocalCharText";
    	}
    	printf("Работа с глобальной переменной(INT)( Присвоение, уравнения, format, floatround ): %d тиков\n\n\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    LocalFloat = 231.123;
            LocalFloat = 1243.5423;
            LocalFloat = 2434.645;
            LocalFloat = 1497124.43;
            LocalFloat = 23847290.51;
            LocalFloat = 123.81;
            LocalFloat = 12.54;
            LocalFloat = 2;
            LocalFloat = 45.345;
            LocalFloat = 385.042;
    	}
    	printf("Присвоение значений локальной переменной(FLOAT): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    LocalFloat = LocalFloat-24.026;
    	    LocalFloat = 23.55-23.53;
    	    LocalFloat = 23.55*23.67+54.93*98.43-400.30/200.5;
    	    format(LocalChar, sizeof(LocalChar), "%f%f%f%f%f%f%f%f%f%f", LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat, LocalFloat);
            LocalFloat = 385.042;
    	}
    	printf("Работа с локальной переменной(FLOAT)( Присвоение, уравнения, format ): %d тиков\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalFloat = 231.123;
            GlobalFloat = 1243.5423;
            GlobalFloat = 2434.645;
            GlobalFloat = 1497124.43;
            GlobalFloat = 23847290.51;
            GlobalFloat = 123.81;
            GlobalFloat = 12.54;
            GlobalFloat = 2;
            GlobalFloat = 45.345;
            GlobalFloat = 385.042;
    	}
    	printf("Присвоение значений глобальной переменной(FLOAT): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalFloat = GlobalFloat-24.026;
    	    GlobalFloat = 23.55-23.53;
    	    GlobalFloat = 23.55*23.67+54.93*98.43-400.30/200.5;
    	    format(LocalChar, sizeof(LocalChar), "%f%f%f%f%f%f%f%f%f%f", GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat, GlobalFloat);
            GlobalFloat = 385.042;
    	}
    	printf("Работа с глобальной переменной(FLOAT)( Присвоение, уравнения, format ): %d тиков\n\n\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = false;
    	}
    	printf("Присвоение значений локальной переменной(BOOL): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = false;
    	    LocalBool = true;
    	    LocalBool = !LocalBool;
    	    LocalBool = !LocalBool;
    	    LocalBool = !LocalBool;
    	    LocalBool = !LocalBool;
    	    format(LocalChar, sizeof(LocalChar), "%b%b%b%b%b", LocalBool, LocalBool, LocalBool, LocalBool, LocalBool);
    	    LocalBool = false;
    	}
    	printf("Работа с локальной переменной(BOOL) ( Присвоение, логическое отрицание, format ): %d тиков\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalBool = false;
    	    GlobalBool = true;
    	    GlobalBool = false;
    	    GlobalBool = true;
    	    GlobalBool = false;
    	}
    	printf("Присвоение значений глобальной переменной(BOOL): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
    	    GlobalBool = false;
    	    GlobalBool = true;
    	    GlobalBool = false;
    	    GlobalBool = true;
    	    GlobalBool = false;
    	    GlobalBool = !GlobalBool;
    	    GlobalBool = !GlobalBool;
    	    GlobalBool = !GlobalBool;
    	    GlobalBool = !GlobalBool;
    	    format(LocalChar, sizeof(LocalChar), "%b%b%b%b%b", GlobalBool, GlobalBool, GlobalBool, GlobalBool, GlobalBool);
    	}
    	printf("Работа с глобальной переменной(BOOL) ( Присвоение, логическое отрицание, format ): %d тиков\n", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	
    	
    	
    	
    	for(new i; i < 10000000; i++)
    	{
    	    LocalCharMassive[0] = "Это текст";
    	    LocalCharMassive[0] = "и это текст";
    	    LocalCharMassive[0] = "не поверишь, и это текст";
    	    LocalCharMassive[1] = "Это текст";
    	    LocalCharMassive[1] = "и это текст";
    	    LocalCharMassive[1] = "не поверишь, и это текст";
    	    LocalCharMassive[0] = "Testing Text";
    	    LocalCharMassive[1] = "Text for test";
    	}
    	printf("Изменение локальных двухмерных массивов(текст): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
     		SendClientMessageToAll(-1, LocalCharMassive[0]);
    	    SendClientMessage(random(MAX_PLAYERS), -1, LocalCharMassive[0]);
    	    format(LocalCharMassive[0], sizeof(LocalCharMassive[]), "%s%d%f%b", LocalCharMassive[0], LocalInt, LocalFloat, LocalBool);
    	    strcat(LocalCharMassive[0], LocalCharMassive[0]);
    	    strcat(LocalCharMassive[0], "Doubled xDDDDDD");
    	    LocalCharMassive[0] = "LocalCharText";
    	    
    	    SendClientMessageToAll(-1, LocalCharMassive[1]);
    	    SendClientMessage(random(MAX_PLAYERS), -1, LocalCharMassive[1]);
    	    format(LocalCharMassive[1], sizeof(LocalCharMassive[]), "%s%d%f%b", LocalCharMassive[1], LocalInt, LocalFloat, LocalBool);
    	    strcat(LocalCharMassive[1], LocalCharMassive[1]);
    	    strcat(LocalCharMassive[1], "Doubled xDDDDDD");
    	    LocalCharMassive[1] = "LocalCharText";
    	}
    	printf("Работа с локальными двухмерными массивами(текст) ( SendClientMessage(ToAll), format, strcat ): %d тиков", GetTickCount()-ticks);
        ticks = GetTickCount();
        
        
        
        
        for(new i; i < 10000000; i++)
    	{
    	    GlobalCharMassive[0] = "Это текст";
    	    GlobalCharMassive[0] = "и это текст";
    	    GlobalCharMassive[0] = "не поверишь, и это текст";
    	    GlobalCharMassive[1] = "Это текст";
    	    GlobalCharMassive[1] = "и это текст";
    	    GlobalCharMassive[1] = "не поверишь, и это текст";
    	    GlobalCharMassive[0] = "Testing Text";
    	    GlobalCharMassive[1] = "Text for test";
    	}
    	printf("Изменение глобальных двухмерных массивов(текст): %d тиков", GetTickCount()-ticks);
    	ticks = GetTickCount();
    	for(new i; i < 10000000; i++)
    	{
     		SendClientMessageToAll(-1, GlobalCharMassive[0]);
    	    SendClientMessage(random(MAX_PLAYERS), -1, GlobalCharMassive[0]);
    	    format(GlobalCharMassive[0], sizeof(GlobalCharMassive[]), "%s%d%f%b", GlobalCharMassive[0], GlobalInt, GlobalFloat, GlobalBool);
    	    strcat(GlobalCharMassive[0], GlobalCharMassive[0]);
    	    strcat(GlobalCharMassive[0], "Doubled xDDDDDD");
    	    GlobalCharMassive[0] = "GlobalCharText";
    
    	    SendClientMessageToAll(-1, GlobalCharMassive[1]);
    	    SendClientMessage(random(MAX_PLAYERS), -1, GlobalCharMassive[1]);
    	    format(GlobalCharMassive[1], sizeof(GlobalCharMassive[]), "%s%d%f%b", GlobalCharMassive[1], GlobalInt, GlobalFloat, GlobalBool);
    	    strcat(GlobalCharMassive[1], GlobalCharMassive[1]);
    	    strcat(GlobalCharMassive[1], "Doubled xDDDDDD");
    	    GlobalCharMassive[1] = "GlobalharText";
    	}
    	printf("Работа с глобальными двухмерными массивами(текст) ( SendClientMessage(ToAll), format, strcat ): %d тиков", GetTickCount()-ticks);
        ticks = GetTickCount();
    }
  • Описание тестов
    Как видно, в каждом случае свой вариант скорости. Давайте рассмотрим по очереди:

    1. Переменные Целых Чисел(integer, INT):

    Переменные int ясно дали знать о себе в тесте. Они - медленней в плане работы с ними, но быстрее только при присвоении.
    Глобальные в общем счете - выиграли этот раунд...


    2. Текстовые массивы:

    Полностью идентично с Переменными Целых Чисел


    3. Переменные Числа с плавающей точкой(Float).

    Тут уже идет немножко по-другому. На этот раз при использовании переменной в функциях и операциях победили Локальные переменные, а в плане присвоения победили Глобальные.

    Локальные выиграли.


    4. Переменные принимающие значения true/false (правда/ложь, 1/0).

    Тут уже интересней. Полную победу получают глобальные переменные, как и при работе, так и в присвоении глобальные быстрее.


    5. Двухмерные текстовые массивы.

    Казалось-бы что они идентичны к обычным массивам, отличается только медленностью. Но не тут то было...

    Тут локальные переменные в обоих случаях уделали глобальные. То-есть создание двухмерных массивов как глобальные плоховато.

    Итог раундов:
    Локальные 2 : 3 Глобальные
  • Выводы:
    Глобальные переменные в большинстве случаев лучше чем локальные, но это зависит от случая... Бывает что лучше локальные, а лучше глобальные...

    Давайте прочитаем важное сообщение!
  • Важно! Прошу прочитать!

    Сразу хочу сообщить что не намерен заставлять вас забивать свой мод только глобальными переменными! Каждый случай - разные результаты!
    Я и сам редко буду делать выше сказанного ведь тест я делал что-бы удостоверится в правде слов "топ-скриптеров"!
    Тем более тесты проделаны на циклах с 1.000.000 итераций, что много! И на сервере такая мелкая оптимизация даст ещё меньше скорости чем разница в тесте.
    Эта мелкая оптимизация, но при многократном использовании тех или иных переменных, лучше опираться на эту тему....

 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу