• Страница 1 из 1
  • 1
Модератор форума: [east_side]_trane, drifter-dron, valych, admin  
y_ini - Fast INI file reading and writing.
adminДата: Воскресенье, 05.12.2010, 08:21:15 | Сообщение # 1

Группа: Администраторы
Сообщений: 3869
Введение

Это немного очистку старой системы в INI YSI. Не так много на самом деле изменилось, только несколько исправляет ошибку и добавили поддержку tagless файлов INI, таких как файлы Дини.

Я буду в ближайшие дни выпустить пользователей системы, основанной на этом, а также обертки, чтобы режимы использования Дини, чтобы воспользоваться улучшенной чтения и письма.

Обновление

* Исправлено несколько ошибок.
* Подчистили код в чтении и письме функций.
* Добавлена чтения и записи, для наговора, BOOL и бинарные.
* Это обновление устраняет проблемы с запятой "INI_Int" и т.д. - это означает, что вы должны иметь точку с запятой. Это также означает, что вы теперь должны иметь возвращения в конце вашего груза функции.

Скачать

Эта библиотека является частью YSI, которую можно найти здесь. Держите глаза на эту тему, и сервер журнала обновлений.

Используйте

Для использования этого просто включите заголовок:

Code
#include <YSI\y_ini>

Чтение

Эта система отличается в использовании весьма существенно от Дини, но по уважительной причине. В Дини вы открываете файл, поиск одного значения, читал, что значение, закройте файл и повторите. Представьте себе этот код:

Code
gA = dini_Get("myini.ini", "c");
gB = dini_Get("myini.ini", "b");
gC = dini_Get("myini.ini", "a");

И это INI файл:
Code
a = 10
b = 67
c = 42

Если вы не можете сказать, что будет открывать и закрывать файл в 3 раза и читать 6 строк в, только за 3 значения - ведь вы должны просто открыть файл раз и читать 3 линии? Это эквивалентно код y_ini:
Code
INI:myini[](name[], value[])
{
      INI_String("a", gA);
      INI_String("b", gB);
      INI_String("c", gC);
      return 0; // This is now required.
}

Code
INI_Load("myini.ini");

Код немного дольше, но это намного быстрее, только чтение файлов сразу. Esentially y_ini использует обратные вызовы для загрузки файлов вместо явного чтения отдельных значений, что означает, файлы читаются в порядке, они хранятся. Я намерен добавить возможность загружать отдельные значения позже, но редко какой-либо необходимости, если вы делаете вещи правильно - прочитать файл и получить данные, он не собирается менять, если вы не измените его.

Синтаксис файла также немного странным, но мы придем к этому позже.

Обратите внимание, что двоеточие в конце раньше ошибка, это теперь не так.

Дать

y_ini пишет значения в очень похоже на Дини, хотя вы явно открывать и закрывать файл - Дини открывает и закрывает его на каждое значение. Кроме того, он буферов пишет - вам не нужно беспокоиться о точности, как она работает, это просто означает, что он пишет много значений одновременно.

Code
new
      INI:ini = INI_Open("myini.ini");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_WriteFloat(ini, "HEALTH", health);
INI_Close(ini);

Удаление

Вы также можете удалить значения из файла:

Code
new
      INI:ini = INI_Open("myini.ini");
INI_RemoveEntry(ini, "NAME");
INI_Close(ini);

Это удалит поле "Имя" из текущего тега (см. ниже). Вот как все просто. Исключения могут быть смешаны с пишет:
Code
new
      INI:ini = INI_Open("myini.ini");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_RemoveEntry(ini, "NAME");
INI_WriteFloat(ini, "HEALTH", health);
INI_Close(ini);

Теги

Другая особенность в yini не в Дини теги в INI-файлы:

Code
[LVDM]
health = 4.23
pos = 2500 1968 7.3

[SFTDM]
health = 100
pos = -2134 -980 2

Если у вас есть два режима (или даже только две библиотеки) в Дини, любой пользователь системы будет необходимо использовать отдельные файлы для каждого из них. А здесь данные различных режимах "разделены по тегам (бит в квадратных скобках). Это где нечетные синтаксис читать функции вошел

* Чтение

Чтобы прочитать только в LVDM данных вы могли бы сделать:

Code
INI:filename[LVDM](name[], value[])
{
      INI_Float("health", gHealth);
      if (!strcmp(name, "pos") && !sscanf(value, "fff", gX, gY, gZ))
      {
          return;
      }
}

Здесь "LVDM" из тега фактически вложено в прототипе функции. Общий формат:
Code
INI:filename[tagname](name[], value[])
{
}

Или, как показано в приведенном выше примере, пустой тэг для tagless данных.

* Дать

Чтобы записать данные в теги просто первый набор тегов:

Code
new
      INI:ini = INI_Open("myini.ini");
INI_SetTag(ini, "LVDM");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_Close(ini);

Функции

* INI_Int
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Макрос для облегчения загрузки целых чисел из файла INI. Данные передаются на загрузку обратного вызова в виде строки, это будет преобразовать его в целое (с использованием sscanf если это возможно, нормальных функций, если нет) и сохранить в данной переменной. Сначала проверяет, что имя данных прошли матчи имя. Обратите внимание, что для этого макроса работать переменные должны называться "имя" и "значение".
Примеры:

Сохранить целое:

Code
INI:filename[tag](name[], value[])
{
      INI_Int("LEVEL", gLevel);
}

Сохранить целое число, для игрока (если вы использовали соответствующий вызов INI_Load):
Code
INI:filename[tag](playerid, name[], value[])
{
      INI_Int("PLAYER_LEVEL", gLevel[playerid]);
}

# INI_Float
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение, как поплавок, если имя совпадает.

# INI_Hex
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение как рубить номер, если имя совпадает.

# INI_Bin
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохранение номера в форме 0b1001101 (двоичные), если имя совпадает.

# INI_Bool
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение как логическое (истина / ложь), если имя совпадает.

# INI_String
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.
длина - Длина массива назначения.

Сохраняет прошло значения в виде строки, если имя совпадает.

# INI_Load
Файл [] - файл для загрузки.
BOOL: Bextra - Отправить дополнительных данных.
дополнительные - дополнительные данные для отправки.
bLocal - Call локальных функций вместо gloabal них.

Считывает файл целиком. Все, кроме имени файла не является обязательным.

Примеры:

Загрузок данный файл:

Code
INI_Load(filename);

Загружает указанный файл и передает функции загрузки дополнительных данных (например Player ID):
Code
INI_Load(filename, true, playerid);

Code
INI:filename[tag](playerid, name[], value[])
{
}

Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);

Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);

* INI_Open
Файл [] - INI-файл, чтобы открыть.

Открывает INI-файл для записи. Возвращает ручка с тега типа "INI:".

* INI_Close
INI: файл - дескриптор INI, чтобы закрыть.

Закрывает настоящее время записывается в файл.

* INI_SetTag
INI: Файл - INI-файл ручкой для записи.
Тег [] - название нового подраздела файл для последующего данные для записи.

Устанавливает новые [теги] раздел заголовка. Последующие данные записываются под этим заголовком.

* INI_RemoveEntry
INI: Файл - Файл для записи.
Название [] - Предмет удалить.

Удаляет запись из текущего тега текущего файла.

* INI_WriteString
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных [] - Данные.

Создать строку в текущей INI.

* INI_WriteInt
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI.

* INI_WriteHex
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI как шестнадцатеричное значение (0x1F182).

* INI_WriteBool
INI: Файл - Файл для записи.
Название [] - Данные имя.
данные - логическое данных.

Создать Boolean (истина / ложь) в текущем INI.

* INI_WriteBin
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI в двоичном формате (0b1001010).

* INI_WriteFloat
INI: Файл - Файл для записи.
Название [] - Данные имя.
Поплавок: данные - Float данных.
Точность - число знаков после запятой, чтобы написать.

Создать всплывают на текущий INI.

Расширенный

Существует одна функция, не обозначенные выше, которая вызывает функцию INI_Load:

* INI_ParseFile
Файл [] - файл для загрузки.
remoteFormat [] - Какую функцию для вызова.
BOOL: bFileFirst - Что для формата функции.
BOOL: Bextra - Отправить дополнительных данных.
дополнительные - дополнительные данные для отправки.
bLocal - Call локальных функций вместо gloabal них.
BOOL: bPassTag - Какие дополнительные данные для передачи.

Эта функция заслуживает раздел для себя самого.

Часто, чтобы прочитать в файлах "INI_Load" будет делать, но это весьма ограничительный в какие функции он вызывает. Если у вас есть файлы пользователей на основе их название вам потребуется функция для каждого пользователя, однако, что, очевидно, невозможно, так что вы хотите удалить файл из вызываемой функции. Это где "remoteFormat", "bFileFirst" и "bPassTag" параметры входите

remoteFormat - определяет формат функция для вызова, в стандартном "формате" структуры. Есть две строки параметров может потребоваться - текущее имя файла и текущий тег в файле. Например, если у вас есть функция, определенная как:

Code
forward User_LVDM(name[], value[]);
public User_LVDM(name[], value[])

Вы должны установить "remoteFormat" на:
Code
"User_%s"

Первая% s. текущего тега, второй S% (оба дополнительно) файла.

bFileFirst - Это свопы порядка данные, передаваемые функции формате, если это правда (по умолчанию false) первые% S в remoteFormat это имя файла, а второй тег.

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

Нагрузка весь файл сразу:

Code
forward LoadOneFile(tag[], name[], value[]);
public LoadOneFile(tag[], name[], value[])
{
}

Code
INI_ParseFile("myini.ini", "LoadOneFile", .bPassTag = true);

Нагрузка весь файл для одного игрока сразу:
Code
forward LoadOneUser(playerid, tag[], name[], value[]);
public LoadOneUser(playerid, tag[], name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser", .bExtra = true, .extra = playerid, .bPassTag = true);

Нагрузка один тег для одного игрока:
Code
forward LoadOneUser_LVDM(playerid, name[], value[]);
public LoadOneUser_LVDM(playerid, name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser_%s", false, true, playerid);

Загрузите файл INI из одного сценария и трансляцию данных по всему серверу. Очень полезно для администратора / пользователя filterscripts чтобы каждый режим для загрузки своих собственных данных.
Code
forward LoadOneUser_LVDM(playerid, name[], value[]);
public LoadOneUser_LVDM(playerid, name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser_%s", false, true, playerid, false);

Загрузить файл по имени файла, проходящей тег функции, с дополнительными данными и вещания:
Code
forward Load_myini(playerid, tag[], name[], value[]);
public Load_myini(playerid, tag[], name[], value[])
{
}

Code
INI_ParseFile("myini.ini", "Load_%s", true, true, playerid, false, true);

Отметим, что дополнительный параметр может быть что угодно, а не только PlayerID, а не только Int (хотя она не может быть строка или массив). Это просто происходит, были предназначены для playerids.

Тайминги

Сроки сравнения Дини и SII. Это загрузка 400000 значений из INI-файлы скромные размеры (менее 64 записи (42)). Обратите внимание, что "менее 64" является важным - по умолчанию yini может буфера 64 значений, когда делая вид, что Дини (что является особенностью в моей локальной версии, но еще не выпущен):

Code
dini: 63810 - Yes, that's just over 1 minute
yini: 1564 - Yes, that's just over 1 second
yini as dini 1: 6009 - Just over 6 seconds
yini as dini 2: 91159 - About a minute and a half
SII: 52807

Я просто объяснить некоторые результаты. Как я уже говорил в течение года - Дини, в то время популярный, безумно медленно, здесь это почти 45x медленнее, чем yini.

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

Два примера yini позирует как Дини являются двумя крайностями. Система yini / Дини считывает файл и буферов. Если файл все еще находится в буфер при следующем запросе из того же файла приходит результат возвращается из памяти, а не от повторного чтения файла в качестве Дини делает.

Первый из этих двух результатов, где вы читали много значений одновременно. В этой версии файл читается один раз и буфером, то все данные получили из буфера. Это, откровенно говоря, наиболее вероятный исход.

Вторая версия, которая на самом деле медленнее, чем Дини, где вы читали несколько значений, то читать другие файлы INI, то читать далее значения. yini может буфера до четырех файлов (по умолчанию) сразу, однако, если вы читали ваши Дини файл, а затем прочитать четырех других файлов, система будет свалка Дини файл, чтобы освободить место в памяти. Дини эмуляции yini занимает немного больше времени, чтобы прочитать файл, чем Дини, но она только читает файл раз в общем, вместо Мени раз - что, где скорость приходит от. В этой версии она имеет дело чуть больше читать и буферизации много раз, худшее из обоих миров.

В общем, если вы используете режим эмуляции Дини вы, вероятно, получить средневзвешенная сильно на минимальное время, особенно если вы не откроете файлы INI и оставить их открытыми:

Code
((6009 * 3) + 91159) / 4 = 27296.5

Таким образом, окончательные результаты:
Code
yini: 1564
dini: 63810
emu : 27297
SII: 52807

Усреднение двумя крайностями режиме эмуляции, предполагая, вы, скорее всего, меньше чем за четыре открытых файлов одновременно, дает более 2х ускорить для yini в режиме эмуляции и оригинальный 45x скорости на регулярные yini.

Источник:http://forum.sa-mp.com/showthread.php?t=175565



zm-jail.ru

Разработка сайта samp-pawno.ru


 
СообщениеВведение

Это немного очистку старой системы в INI YSI. Не так много на самом деле изменилось, только несколько исправляет ошибку и добавили поддержку tagless файлов INI, таких как файлы Дини.

Я буду в ближайшие дни выпустить пользователей системы, основанной на этом, а также обертки, чтобы режимы использования Дини, чтобы воспользоваться улучшенной чтения и письма.

Обновление

* Исправлено несколько ошибок.
* Подчистили код в чтении и письме функций.
* Добавлена чтения и записи, для наговора, BOOL и бинарные.
* Это обновление устраняет проблемы с запятой "INI_Int" и т.д. - это означает, что вы должны иметь точку с запятой. Это также означает, что вы теперь должны иметь возвращения в конце вашего груза функции.

Скачать

Эта библиотека является частью YSI, которую можно найти здесь. Держите глаза на эту тему, и сервер журнала обновлений.

Используйте

Для использования этого просто включите заголовок:

Code
#include <YSI\y_ini>

Чтение

Эта система отличается в использовании весьма существенно от Дини, но по уважительной причине. В Дини вы открываете файл, поиск одного значения, читал, что значение, закройте файл и повторите. Представьте себе этот код:

Code
gA = dini_Get("myini.ini", "c");
gB = dini_Get("myini.ini", "b");
gC = dini_Get("myini.ini", "a");

И это INI файл:
Code
a = 10
b = 67
c = 42

Если вы не можете сказать, что будет открывать и закрывать файл в 3 раза и читать 6 строк в, только за 3 значения - ведь вы должны просто открыть файл раз и читать 3 линии? Это эквивалентно код y_ini:
Code
INI:myini[](name[], value[])
{
      INI_String("a", gA);
      INI_String("b", gB);
      INI_String("c", gC);
      return 0; // This is now required.
}

Code
INI_Load("myini.ini");

Код немного дольше, но это намного быстрее, только чтение файлов сразу. Esentially y_ini использует обратные вызовы для загрузки файлов вместо явного чтения отдельных значений, что означает, файлы читаются в порядке, они хранятся. Я намерен добавить возможность загружать отдельные значения позже, но редко какой-либо необходимости, если вы делаете вещи правильно - прочитать файл и получить данные, он не собирается менять, если вы не измените его.

Синтаксис файла также немного странным, но мы придем к этому позже.

Обратите внимание, что двоеточие в конце раньше ошибка, это теперь не так.

Дать

y_ini пишет значения в очень похоже на Дини, хотя вы явно открывать и закрывать файл - Дини открывает и закрывает его на каждое значение. Кроме того, он буферов пишет - вам не нужно беспокоиться о точности, как она работает, это просто означает, что он пишет много значений одновременно.

Code
new
      INI:ini = INI_Open("myini.ini");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_WriteFloat(ini, "HEALTH", health);
INI_Close(ini);

Удаление

Вы также можете удалить значения из файла:

Code
new
      INI:ini = INI_Open("myini.ini");
INI_RemoveEntry(ini, "NAME");
INI_Close(ini);

Это удалит поле "Имя" из текущего тега (см. ниже). Вот как все просто. Исключения могут быть смешаны с пишет:
Code
new
      INI:ini = INI_Open("myini.ini");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_RemoveEntry(ini, "NAME");
INI_WriteFloat(ini, "HEALTH", health);
INI_Close(ini);

Теги

Другая особенность в yini не в Дини теги в INI-файлы:

Code
[LVDM]
health = 4.23
pos = 2500 1968 7.3

[SFTDM]
health = 100
pos = -2134 -980 2

Если у вас есть два режима (или даже только две библиотеки) в Дини, любой пользователь системы будет необходимо использовать отдельные файлы для каждого из них. А здесь данные различных режимах "разделены по тегам (бит в квадратных скобках). Это где нечетные синтаксис читать функции вошел

* Чтение

Чтобы прочитать только в LVDM данных вы могли бы сделать:

Code
INI:filename[LVDM](name[], value[])
{
      INI_Float("health", gHealth);
      if (!strcmp(name, "pos") && !sscanf(value, "fff", gX, gY, gZ))
      {
          return;
      }
}

Здесь "LVDM" из тега фактически вложено в прототипе функции. Общий формат:
Code
INI:filename[tagname](name[], value[])
{
}

Или, как показано в приведенном выше примере, пустой тэг для tagless данных.

* Дать

Чтобы записать данные в теги просто первый набор тегов:

Code
new
      INI:ini = INI_Open("myini.ini");
INI_SetTag(ini, "LVDM");
INI_WriteString(ini, "NAME", "Y_Less");
INI_WriteInt(ini, "SCORE", gScore);
INI_Close(ini);

Функции

* INI_Int
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Макрос для облегчения загрузки целых чисел из файла INI. Данные передаются на загрузку обратного вызова в виде строки, это будет преобразовать его в целое (с использованием sscanf если это возможно, нормальных функций, если нет) и сохранить в данной переменной. Сначала проверяет, что имя данных прошли матчи имя. Обратите внимание, что для этого макроса работать переменные должны называться "имя" и "значение".
Примеры:

Сохранить целое:

Code
INI:filename[tag](name[], value[])
{
      INI_Int("LEVEL", gLevel);
}

Сохранить целое число, для игрока (если вы использовали соответствующий вызов INI_Load):
Code
INI:filename[tag](playerid, name[], value[])
{
      INI_Int("PLAYER_LEVEL", gLevel[playerid]);
}

# INI_Float
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение, как поплавок, если имя совпадает.

# INI_Hex
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение как рубить номер, если имя совпадает.

# INI_Bin
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохранение номера в форме 0b1001101 (двоичные), если имя совпадает.

# INI_Bool
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.

Сохраняет переданное значение как логическое (истина / ложь), если имя совпадает.

# INI_String
Название [] - название INI текстовой идентификатор.
переменная - переменная для хранения в.
длина - Длина массива назначения.

Сохраняет прошло значения в виде строки, если имя совпадает.

# INI_Load
Файл [] - файл для загрузки.
BOOL: Bextra - Отправить дополнительных данных.
дополнительные - дополнительные данные для отправки.
bLocal - Call локальных функций вместо gloabal них.

Считывает файл целиком. Все, кроме имени файла не является обязательным.

Примеры:

Загрузок данный файл:

Code
INI_Load(filename);

Загружает указанный файл и передает функции загрузки дополнительных данных (например Player ID):
Code
INI_Load(filename, true, playerid);

Code
INI:filename[tag](playerid, name[], value[])
{
}

Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);

Загрузите файл INI, и отправить уже загруженных данных для всех запуск сценариев:
Code
INI_Load(filename, .bLocal = false);

* INI_Open
Файл [] - INI-файл, чтобы открыть.

Открывает INI-файл для записи. Возвращает ручка с тега типа "INI:".

* INI_Close
INI: файл - дескриптор INI, чтобы закрыть.

Закрывает настоящее время записывается в файл.

* INI_SetTag
INI: Файл - INI-файл ручкой для записи.
Тег [] - название нового подраздела файл для последующего данные для записи.

Устанавливает новые [теги] раздел заголовка. Последующие данные записываются под этим заголовком.

* INI_RemoveEntry
INI: Файл - Файл для записи.
Название [] - Предмет удалить.

Удаляет запись из текущего тега текущего файла.

* INI_WriteString
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных [] - Данные.

Создать строку в текущей INI.

* INI_WriteInt
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI.

* INI_WriteHex
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI как шестнадцатеричное значение (0x1F182).

* INI_WriteBool
INI: Файл - Файл для записи.
Название [] - Данные имя.
данные - логическое данных.

Создать Boolean (истина / ложь) в текущем INI.

* INI_WriteBin
INI: Файл - Файл для записи.
Название [] - Данные имя.
данных - Integer данных.

Создать Int на текущий INI в двоичном формате (0b1001010).

* INI_WriteFloat
INI: Файл - Файл для записи.
Название [] - Данные имя.
Поплавок: данные - Float данных.
Точность - число знаков после запятой, чтобы написать.

Создать всплывают на текущий INI.

Расширенный

Существует одна функция, не обозначенные выше, которая вызывает функцию INI_Load:

* INI_ParseFile
Файл [] - файл для загрузки.
remoteFormat [] - Какую функцию для вызова.
BOOL: bFileFirst - Что для формата функции.
BOOL: Bextra - Отправить дополнительных данных.
дополнительные - дополнительные данные для отправки.
bLocal - Call локальных функций вместо gloabal них.
BOOL: bPassTag - Какие дополнительные данные для передачи.

Эта функция заслуживает раздел для себя самого.

Часто, чтобы прочитать в файлах "INI_Load" будет делать, но это весьма ограничительный в какие функции он вызывает. Если у вас есть файлы пользователей на основе их название вам потребуется функция для каждого пользователя, однако, что, очевидно, невозможно, так что вы хотите удалить файл из вызываемой функции. Это где "remoteFormat", "bFileFirst" и "bPassTag" параметры входите

remoteFormat - определяет формат функция для вызова, в стандартном "формате" структуры. Есть две строки параметров может потребоваться - текущее имя файла и текущий тег в файле. Например, если у вас есть функция, определенная как:

Code
forward User_LVDM(name[], value[]);
public User_LVDM(name[], value[])

Вы должны установить "remoteFormat" на:
Code
"User_%s"

Первая% s. текущего тега, второй S% (оба дополнительно) файла.

bFileFirst - Это свопы порядка данные, передаваемые функции формате, если это правда (по умолчанию false) первые% S в remoteFormat это имя файла, а второй тег.

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

Нагрузка весь файл сразу:

Code
forward LoadOneFile(tag[], name[], value[]);
public LoadOneFile(tag[], name[], value[])
{
}

Code
INI_ParseFile("myini.ini", "LoadOneFile", .bPassTag = true);

Нагрузка весь файл для одного игрока сразу:
Code
forward LoadOneUser(playerid, tag[], name[], value[]);
public LoadOneUser(playerid, tag[], name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser", .bExtra = true, .extra = playerid, .bPassTag = true);

Нагрузка один тег для одного игрока:
Code
forward LoadOneUser_LVDM(playerid, name[], value[]);
public LoadOneUser_LVDM(playerid, name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser_%s", false, true, playerid);

Загрузите файл INI из одного сценария и трансляцию данных по всему серверу. Очень полезно для администратора / пользователя filterscripts чтобы каждый режим для загрузки своих собственных данных.
Code
forward LoadOneUser_LVDM(playerid, name[], value[]);
public LoadOneUser_LVDM(playerid, name[], value[])
{
}

Code
INI_ParseFile(playerfile, "LoadOneUser_%s", false, true, playerid, false);

Загрузить файл по имени файла, проходящей тег функции, с дополнительными данными и вещания:
Code
forward Load_myini(playerid, tag[], name[], value[]);
public Load_myini(playerid, tag[], name[], value[])
{
}

Code
INI_ParseFile("myini.ini", "Load_%s", true, true, playerid, false, true);

Отметим, что дополнительный параметр может быть что угодно, а не только PlayerID, а не только Int (хотя она не может быть строка или массив). Это просто происходит, были предназначены для playerids.

Тайминги

Сроки сравнения Дини и SII. Это загрузка 400000 значений из INI-файлы скромные размеры (менее 64 записи (42)). Обратите внимание, что "менее 64" является важным - по умолчанию yini может буфера 64 значений, когда делая вид, что Дини (что является особенностью в моей локальной версии, но еще не выпущен):

Code
dini: 63810 - Yes, that's just over 1 minute
yini: 1564 - Yes, that's just over 1 second
yini as dini 1: 6009 - Just over 6 seconds
yini as dini 2: 91159 - About a minute and a half
SII: 52807

Я просто объяснить некоторые результаты. Как я уже говорил в течение года - Дини, в то время популярный, безумно медленно, здесь это почти 45x медленнее, чем yini.

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

Два примера yini позирует как Дини являются двумя крайностями. Система yini / Дини считывает файл и буферов. Если файл все еще находится в буфер при следующем запросе из того же файла приходит результат возвращается из памяти, а не от повторного чтения файла в качестве Дини делает.

Первый из этих двух результатов, где вы читали много значений одновременно. В этой версии файл читается один раз и буфером, то все данные получили из буфера. Это, откровенно говоря, наиболее вероятный исход.

Вторая версия, которая на самом деле медленнее, чем Дини, где вы читали несколько значений, то читать другие файлы INI, то читать далее значения. yini может буфера до четырех файлов (по умолчанию) сразу, однако, если вы читали ваши Дини файл, а затем прочитать четырех других файлов, система будет свалка Дини файл, чтобы освободить место в памяти. Дини эмуляции yini занимает немного больше времени, чтобы прочитать файл, чем Дини, но она только читает файл раз в общем, вместо Мени раз - что, где скорость приходит от. В этой версии она имеет дело чуть больше читать и буферизации много раз, худшее из обоих миров.

В общем, если вы используете режим эмуляции Дини вы, вероятно, получить средневзвешенная сильно на минимальное время, особенно если вы не откроете файлы INI и оставить их открытыми:

Code
((6009 * 3) + 91159) / 4 = 27296.5

Таким образом, окончательные результаты:
Code
yini: 1564
dini: 63810
emu : 27297
SII: 52807

Усреднение двумя крайностями режиме эмуляции, предполагая, вы, скорее всего, меньше чем за четыре открытых файлов одновременно, дает более 2х ускорить для yini в режиме эмуляции и оригинальный 45x скорости на регулярные yini.

Источник:http://forum.sa-mp.com/showthread.php?t=175565


Автор - admin
Дата добавления - 05.12.2010 в 08:21:15
Seva008Дата: Среда, 09.02.2011, 12:23:12 | Сообщение # 2

Группа: Пользователи
Сообщений: 80
Данную систему для файлов я не советую,лучше использовать старую,позже распишу

Я не нуб,хоть и им был!
 
СообщениеДанную систему для файлов я не советую,лучше использовать старую,позже распишу

Автор - Seva008
Дата добавления - 09.02.2011 в 12:23:12
  • Страница 1 из 1
  • 1
Поиск:
Загрузка страницы, займет меньше минуты...
Загрузка...

Статистика Форума
Последнии темы Читаемые темы Лучшие пользователи Новые пользователи
Система телефонов поломалась
Не в себе
фильм скалайн
Трансформеры 3
форсаж 6
Ищу [FS]Для админок на сервер
нужны координаты карты для отметки зон...
Помогите найти мод
pawno урок автоматические ворота
обращение к скриптерам.
Вопросы по скриптингу
Ваши ошибки при компиляции GM/FS

Вопросы по скриптингу

(1081)

Считаем до 1000

(274)

Ваши ошибки при компиляция gm

(260)

Набор в команду

(80)

Ваши ошибки при компиляции GM/FS

(71)

вопроосы по скриптингу от 22.04.2013

(64)

Баннеробмен

(64)

несколько команд на samp 0.3 c

(64)

Оценки сайта samp-pawno.ru

(55)

Заказ хостинга

(51)

Набор в команду(форум)

(45)

Урок №61 по созданию системы авто для GodFather

(45)

admin

(3869)

[east_side]_trane

(443)

TWiX

(316)

valych

(501)

drifter-dron

(477)

danik_rok

(317)

Dimka_71rus

(360)

Drifter96

(300)

MaNb9K

(220)

[MTA]MaPeR5518

(181)

Dima_Tkach

(107)

Nik_Ull

(184)

system32xzxz

(Четверг 09:25:24)

torbin169

(Суббота 23:09:29)

kuchuk_00

(Суббота 17:10:14)

artem_boyko_3

(Суббота 15:57:37)

greggelbak

(Среда 18:29:37)

vladisvlavs

(Среда 13:51:57)

add02102002

(Понедельник 22:37:15)

Диман221

(Понедельник 18:12:45)

almas051004

(Воскресенье 11:05:32)

megasuccessms

(Суббота 14:15:36)

nawe

(Пятница 22:25:23)

swoysb

(Пятница 14:55:29)

Вверх
21:55:21
ОбновитьСмайлыУправление мини-чатом
ЧАТ-PAWNO
2010-2025

vkontakte :samp-pawno.ru: