PDA

Просмотр полной версии : [Вопрос] Память в pawn. Процесс компиляции. Прочие небольшие вопросы.



Elrmrnt-Kritik
15.06.2018, 01:09
Добрый вечер. Хотел бы задать несколько небольших вопросов, касающихся видов памяти в pawn, процесса компиляции и еще парочку :blush2:.

1. Есть ли правильно говорить, что сегмент данных - статическая память? Почему-то на просторах интернета вместо сегмента данных всегда говорят статическая память, но ни на одном из форумов про pawn (по крайней мере я не замечал).

2. Размер памяти, определяемой через #pragma dynamic, включает в себя и кучу, и стэк, и сегмент данных? Вообще все, что мы выделяем через #pragma dynamic, при запуске сервера запрашивает винда у процессора? (или у кого там... В общем, чтобы выделили какую-то память под программу).

3. Когда мы тыкаем на кнопку компиляции, сначала работает препроцессор - "сует" инклуды в мод, подставляет значения макросов. Делает ли он что-нибудь еще? Происходит ли что-нибудь после компиляции (может есть какой-нибудь постпроцессор?). И компилируется ли #emit?

4. Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?

public OnGameModeInit()
{
new a;
// поехали 1
a = 0;
for(new i = 0; i < 1_000_000; i++)
a++;
// поехали 2
a = 0;
for(new i = 0; i < 1_000_000; i++)
a+=1;
// поехали 3
a = 0;
for(new i = 0; i < 1_000_000; i++)
a = a+1;
return 1;
}

Глупы пример, но не суть. По идее: во всех случаях используется одинаковый адрес к ячейке, во всех случаях переменная начинает изменяться с нуля. Единственное, возможно, стоило переменную-счетчик вынести в начало, чтобы у нее тоже адрес был постоянен. Но я очень сомневаюсь, что тут адрес переменной на что-то влияет.

5. Пожалуй, последнее и не очень связанное с pawn. В общем, давно заметил такую беду, что если PlayerTextDraw вынести в отдельный файл (инклуд) и подключить в OnPlayerConnect, то на самом сервере он не будет отображаться (либо очень коряво). С OnGameModeInit такого не замечал. Спрашивал у знакомого, который сказал, что тоже встречался с такой проблемой. Решение не нашел. Из-за чего такое вообще может быть? Ведь компилятору должно быть безразлично в какую функцию мы это добавляем.

Заранее большое всем спасибо :i-m_so_happy:

VVWVV
15.06.2018, 02:47
Добрый вечер. Хотел бы задать несколько небольших вопросов, касающихся видов памяти в pawn, процесса компиляции и еще парочку :blush2:.

1. Есть ли правильно говорить, что сегмент данных - статическая память? Почему-то на просторах интернета вместо сегмента данных всегда говорят статическая память, но ни на одном из форумов про pawn (по крайней мере я не замечал).

2. Размер памяти, определяемой через #pragma dynamic, включает в себя и кучу, и стэк, и сегмент данных? Вообще все, что мы выделяем через #pragma dynamic, при запуске сервера запрашивает винда у процессора? (или у кого там... В общем, чтобы выделили какую-то память под программу).

3. Когда мы тыкаем на кнопку компиляции, сначала работает препроцессор - "сует" инклуды в мод, подставляет значения макросов. Делает ли он что-нибудь еще? Происходит ли что-нибудь после компиляции (может есть какой-нибудь постпроцессор?). И компилируется ли #emit?

4. Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?

public OnGameModeInit()
{
new a;
// поехали 1
a = 0;
for(new i = 0; i < 1_000_000; i++)
a++;
// поехали 2
a = 0;
for(new i = 0; i < 1_000_000; i++)
a+=1;
// поехали 3
a = 0;
for(new i = 0; i < 1_000_000; i++)
a = a+1;
return 1;
}

Глупы пример, но не суть. По идее: во всех случаях используется одинаковый адрес к ячейке, во всех случаях переменная начинает изменяться с нуля. Единственное, возможно, стоило переменную-счетчик вынести в начало, чтобы у нее тоже адрес был постоянен. Но я очень сомневаюсь, что тут адрес переменной на что-то влияет.

5. Пожалуй, последнее и не очень связанное с pawn. В общем, давно заметил такую беду, что если PlayerTextDraw вынести в отдельный файл (инклуд) и подключить в OnPlayerConnect, то на самом сервере он не будет отображаться (либо очень коряво). С OnGameModeInit такого не замечал. Спрашивал у знакомого, который сказал, что тоже встречался с такой проблемой. Решение не нашел. Из-за чего такое вообще может быть? Ведь компилятору должно быть безразлично в какую функцию мы это добавляем.

Заранее большое всем спасибо :i-m_so_happy:

1. Можно сказать, что эти два понятие - одинаковые.
2. Нет, только по стек и кучу. Компилятор высчитывает макс. использование блока стека и кучи, а после сохраняет это значение в бинарный файл с байт-кодом. Интерпретатор же при загрузке скрипта запрашивает память у ОС для хранения данных (обычно через функцию malloc). pragma dynamic говорит компилятору точный размер блока стека/кучи.
3. Препроцессор - все то, что связано с директивами. Ничего более он делать не должен. Ситуация с #emit странная, поскольку данная препроцессорная директива должна быть оператором, как, например, в компиляторе с исправлениями от Zeex. Далее идёт компиляция, то есть из исходного кода в байт-код.
4. Скорее всего, поскольку процессоры кешируют инструкции. Используйте вариант от DC.
5. Быть может kalcor что-то не так сделал. Компилятор тут вовсе не причём.

Geebrox
15.06.2018, 07:03
5. Не замечал такое. Я тоже создаю PlayerTextDraw в отельном файле и подключаю её. Далее просто вызываю нужную функцию в OnPlayerConnect (или в любом другом колбэке/функции в котором нужны эти текстдравы). Вроде всё норм.

Daniel_Cortez
15.06.2018, 08:03
Есть ли правильно говорить, что сегмент данных - статическая память?
Лично мне понятие "статическая память" не приходилось встречать ни разу - наверное, потому что вся память в Pawn статическая, ибо под скрипт выделяется всего один блок памяти, который в свою очередь уже разделяется на секции. При этом термин "data section"/"data segment" много раз встречается в документации к Pawn ("Pawn Implementor's Guide", если быть точным, + пара упоминаний в "Pawn Language Guide"). Так что, судите сами.



Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?

public OnGameModeInit()
{
new a;
// поехали 1
a = 0;
for(new i = 0; i < 1_000_000; i++)
a++;
// поехали 2
a = 0;
for(new i = 0; i < 1_000_000; i++)
a+=1;
// поехали 3
a = 0;
for(new i = 0; i < 1_000_000; i++)
a = a+1;
return 1;
}

Следует помнить, что тестирование выполняется на многозадачной ОС. Во время выполнения теста какой-нибудь сторонний процесс может начать потреблять больше ресурсов ЦП (например, антивирус начнёт проверку какого-нибудь файла) - соответственно, для теста ресурсов останется меньше и результат одного или нескольких пунктов теста будет испорчен. Вот здесь-то и нужны вложенные циклы: они помогают равномерно (ну или почти равномерно) распределить стороннее влияние между всеми пунктами теста и тем самым снизить погрешность в результатах.



Пожалуй, последнее и не очень связанное с pawn. В общем, давно заметил такую беду, что если PlayerTextDraw вынести в отдельный файл (инклуд) и подключить в OnPlayerConnect, то на самом сервере он не будет отображаться (либо очень коряво). С OnGameModeInit такого не замечал. Спрашивал у знакомого, который сказал, что тоже встречался с такой проблемой. Решение не нашел. Из-за чего такое вообще может быть? Ведь компилятору должно быть безразлично в какую функцию мы это добавляем.
Скорее всего, дело в лимите на текстдравы. Т.е. из инклуда создание текстдрава производится в последнюю очередь и заканчивается неудачей из-за превышения лимита, а при переносе в мод вы вставили код создания текстдрава в самое начало OnGameModeInit(), и теперь вместо него неудачно создаётся какой-нибудь другой текстдрав.

Elrmrnt-Kritik
15.06.2018, 14:03
Спасибо всем огромное :) Только хочу еще прояснить - сегмент данных и секция данных используются как синонимы или что-то из этого есть подмножество другого?

Daniel_Cortez
15.06.2018, 19:57
Спасибо всем огромное :) Только хочу еще прояснить - сегмент данных и секция данных используются как синонимы или что-то из этого есть подмножество другого?
Да, в Pawn Implementor's Guide это взаимозаменяемые понятия, но "data section" используется намного чаще: 15 раз против 2 у "data segment".