Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Помогите оптимизировать условие - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Помогите оптимизировать условие

#1
Пользователь офлайн   bereg101 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Есть код диалогового окна
	
if (PI[playerid][everydayQuests][0] == -1){
	 strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Вы забрали приз\t10 квест-очков\n");
	}
	else if(PI[playerid][everydayQuests][0] < 3) {
		format(str,sizeof(str),""C"1."W" Перевести 3 груза:\t%i/"GREEN"3\t10 квест-очков\n", PI[playerid][everydayQuests][0]);
		strcat(string, str);
	}
	else if(PI[playerid][everydayQuests][0] >= 3) {
		strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Можете забрать приз\t10 квест-очков\n");
	}



Он выводит одну из 3х строк
Квест Прогресс Приз

"Перевести 3 груза: Вы забрали приз 10 квест-очков"
"Перевести 3 груза: 1/3 10 квест-очков" (1/3 это прогресс выполнения задания)
"Перевести 3 груза: Можете забрать приз 10 квест-очков"

Как сделать код записи более короткий? Как по мне 10 строк как то много на 1 строчку диалогового окна

Сообщение отредактировал bereg101: 28 июня 2020 - 13:00

0

#2
Пользователь офлайн   Shvider 

  • Местный
  • Вставить ник
  • Раскрыть информацию
switch(PI[playerid][everydayQuests][0]
)
{
    case -1: //выполнил квест и уже забрал приз
        strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Вы забрали приз\t10 квест-очков\n");
    case 0..2: //в процессе выполнения квеста
    {
        format(str,sizeof(str),""C"1."W" Перевести 3 груза:\t%i/"GREEN"3\t10 квест-очков\n", PI[playerid][everydayQuests][0]);
        strcat(string, str);
    }
    default: //выполнил квест, но не забрал приз
        strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Можете забрать приз\t10 квест-очков\n");
}


Меньше строк не стало, тут особо нечего оптимизировать.
0

#3
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Не там ты оптимизацию пытаешься делать. Ты тут и сотой доли миллисекунды не выиграешь.
Но если и извращаться, то так:
new quest = PI[playerid][everydayQuests][0];
switch(quest)
{
    case -1: //выполнил квест и уже забрал приз
        strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Вы забрали приз\t10 квест-очков\n");
    case 0..2: //в процессе выполнения квеста
    {
        format(string, sizeof(string), "%s"C"1."W" Перевести 3 груза:\t%i/"GREEN"3\t10 квест-очков\n", string, quest);
    }
    default: //выполнил квест, но не забрал приз
        strcat(string, ""C"1."W" Перевести 3 груза:\t"GREEN"Можете забрать приз\t10 квест-очков\n");
}

0

#4
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Пользователи выше, в чем профит в данном случае использовать свитч? Для небольшого диапазона чисел можно воспользоваться if/else конструкцией. В этом случае, имхо, свитч не покажет свой потенциал на полную.

Сообщение отредактировал Pa4enka: 28 июня 2020 - 16:04

0

#5
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (28 июня 2020 - 16:03) писал:

Пользователи выше, в чем профит в данном случае использовать свитч? Для небольшого диапазона чисел можно воспользоваться if/else конструкцией. В этом случае, имхо, свитч не покажет свой потенциал на полную.


В том, что вместо 2-х или 3-х обращений к переменной будет всего одно обращение. Правда, профит от этого будет заметен только если начать этот отрезок кода вызывать циклом с количеством итераций миллионов под 10 (то бишь, частота вызовов будет такой, какую на обычном сервере никогда не достичь). И то там, максимум, счёт будет миллисекунд на 50 разницы между switch и if. Собственно, потому я и написал автору, что не там он оптимизацию пытается делать.

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

Сообщение отредактировал DeimoS: 28 июня 2020 - 16:34

0

#6
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (28 июня 2020 - 16:32) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Ну и как предполагал, принципе. Псевдо-оптимизация :)

Почему при проверке будет два или три обращения к переменной? Если пройдёт первый if, соответственно, последующий блок else if выполнен не будет. По крайней мере, в моей голове это так выглядит.
0

#7
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (28 июня 2020 - 23:54) писал:

Ну и как предполагал, принципе. Псевдо-оптимизация :)


Некорректно это называть псевдо-оптимизацией. В каком-нибудь OnPlayerUpdate даже такие извращения будут полезны. Да и в целом, как я уже писал, если изначально писать код таким образом, то никакой проблемы в этом не будет. Скорее, наоборот такой подход во многих случаях упростит доработку условий, если вдруг нужно будет добавить новые значения.

В целом, нужно понимать, что в условиях самым времязатратным событием является обращение к переменной, а не факт сравнения. Добавь ещё десяток if, а-ля:
stock SwtichFunc(value)
{
	switch(value)
	{
	    case 1:{}
	    case 5:{}
		case 8:{}
		case 11:{}
		case 13:{}
		case 15:{}
		case 18:{}
		case 22:{}
		case 35:{}
		case 38..42:{}
		default:{}
	}
}

stock IfFunc(value)
{
	if(value == 1){}
	else if(value == 5){}
	else if(value == 8){}
	else if(value == 11){}
	else if(value == 13){}
	else if(value == 15){}
	else if(value == 18){}
	else if(value == 22){}
	else if(value == 35){}
	else if(38 <= value <= 42){}
	else {}
}

И switch уже будет раза в полтора быстрее, чем if, если "value" будет равно 42 или не будет равно ни одному из if (то бишь, если сработают все из перечисленных сравнений). А уж если вместо переменной будет сравнение с массивом - switch будет шустрее if раза в 4.

Просмотр сообщенияPa4enka (28 июня 2020 - 23:54) писал:

Почему при проверке будет два или три обращения к переменной? Если пройдёт первый if, соответственно, последующий блок else if выполнен не будет. По крайней мере, в моей голове это так выглядит.

Ну так а если первый if не пройдёт? Каждый вызов if будет по новой вызывать значение переменной. Даже в подобном случае:
if(0 <= variable <= 10)

переменная "variable" будет вызываться 2 раза, а не 1.
Хотя конкретно в этом случае switch будет медленнее, если диапазон значений будет содержать где-то под 50 значений и больше.
То бишь:
switch(variable)
{
    case 0...5: {}
}

На немного, но будет быстрее, чем:
if(0 <= value <= 5) {}// И если вместо обычной переменной будет массив, то разница в скорости будет ещё более существенной

а уже
switch(variable)
{
    case 0...50: {}
}

Будет медленнее, чем
if(0 <= value <= 50) {}

И чем больше диапазон, тем сильнее будет проигрывать switch (да и скорость компиляции будет страдать, ибо switch, при компиляции, "разворачивается" компилятором в обычные if/else if, прописывая весь диапазон значений отдельно).

Сообщение отредактировал DeimoS: 29 июня 2020 - 13:07

0

#8
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (29 июня 2020 - 13:06) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Спасибо за исчерпывающую информацию.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика