Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

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

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

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

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

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

    4. Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?
    1. {
    2. new a;
    3. // поехали 1
    4. a = 0;
    5. for(new i = 0; i < 1_000_000; i++)
    6. a++;
    7. // поехали 2
    8. a = 0;
    9. for(new i = 0; i < 1_000_000; i++)
    10. a+=1;
    11. // поехали 3
    12. a = 0;
    13. for(new i = 0; i < 1_000_000; i++)
    14. a = a+1;
    15. return 1;
    16. }

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

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

    Заранее большое всем спасибо

  2. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Добрый вечер. Хотел бы задать несколько небольших вопросов, касающихся видов памяти в pawn, процесса компиляции и еще парочку .

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

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

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

    4. Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?
    1. {
    2. new a;
    3. // поехали 1
    4. a = 0;
    5. for(new i = 0; i < 1_000_000; i++)
    6. a++;
    7. // поехали 2
    8. a = 0;
    9. for(new i = 0; i < 1_000_000; i++)
    10. a+=1;
    11. // поехали 3
    12. a = 0;
    13. for(new i = 0; i < 1_000_000; i++)
    14. a = a+1;
    15. return 1;
    16. }

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

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

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

  3. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (15.06.2018)
  4. #3
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    5. Не замечал такое. Я тоже создаю PlayerTextDraw в отельном файле и подключаю её. Далее просто вызываю нужную функцию в OnPlayerConnect (или в любом другом колбэке/функции в котором нужны эти текстдравы). Вроде всё норм.
    Респект:
    @DeimoS
    @ziggi
    @Daniel_Cortez

  5. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (15.06.2018)
  6. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Есть ли правильно говорить, что сегмент данных - статическая память?
    Лично мне понятие "статическая память" не приходилось встречать ни разу - наверное, потому что вся память в Pawn статическая, ибо под скрипт выделяется всего один блок памяти, который в свою очередь уже разделяется на секции. При этом термин "data section"/"data segment" много раз встречается в документации к Pawn ("Pawn Implementor's Guide", если быть точным, + пара упоминаний в "Pawn Language Guide"). Так что, судите сами.


    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Видел на форуме чудесную тему про сравнение производительности кода. Столько там мудростей необъятных... У меня прямо даже назревает вопрос: вот эти тесты скорости будут неточными?
    1. {
    2. new a;
    3. // поехали 1
    4. a = 0;
    5. for(new i = 0; i < 1_000_000; i++)
    6. a++;
    7. // поехали 2
    8. a = 0;
    9. for(new i = 0; i < 1_000_000; i++)
    10. a+=1;
    11. // поехали 3
    12. a = 0;
    13. for(new i = 0; i < 1_000_000; i++)
    14. a = a+1;
    15. return 1;
    16. }
    Следует помнить, что тестирование выполняется на многозадачной ОС. Во время выполнения теста какой-нибудь сторонний процесс может начать потреблять больше ресурсов ЦП (например, антивирус начнёт проверку какого-нибудь файла) - соответственно, для теста ресурсов останется меньше и результат одного или нескольких пунктов теста будет испорчен. Вот здесь-то и нужны вложенные циклы: они помогают равномерно (ну или почти равномерно) распределить стороннее влияние между всеми пунктами теста и тем самым снизить погрешность в результатах.


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

  7. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (15.06.2018)
  8. #5
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Спасибо всем огромное :) Только хочу еще прояснить - сегмент данных и секция данных используются как синонимы или что-то из этого есть подмножество другого?

  9. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Спасибо всем огромное :) Только хочу еще прояснить - сегмент данных и секция данных используются как синонимы или что-то из этого есть подмножество другого?
    Да, в Pawn Implementor's Guide это взаимозаменяемые понятия, но "data section" используется намного чаще: 15 раз против 2 у "data segment".
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (15.06.2018)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •