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 итераций, что много! И на сервере такая мелкая оптимизация даст ещё меньше скорости чем разница в тесте.
Эта мелкая оптимизация, но при многократном использовании тех или иных переменных, лучше опираться на эту тему....
Последнее редактирование:
