Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила форума

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

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

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер

[Скриптинг] Хранение SteamID

Статус пользователя Surf
сообщение 28.4.2014, 1:20
Сообщение #1


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Всем привет в этом чате.

Есть плагин для работы с игровой статистикой. Собирает данные о фрагах, смертях, хедшотах.
Что важно: авторизация и подсчет статы идет только для игроков с реальным Steam ID (т.е для лицушных клиентов)

Храню все это дело в файлике. Итого имеем:
1. SteamID
2. Последний использовавшийся ник для данного Steam ID
3. Фраги
4. Хедшоты
5. Смерти


Собственно задался вопросом, есть два варианта хранения SteamID:
1. В строковом виде
2. В 32bit виде (4 байта)

Что лучше, хранить и читать строку (больше использование места на жестком диске, хоть и не значительное + время считывания) или занимать процессорное время переводом string SteamID -> SteamID32bit и обратно?

Для работы нужна именно строка, т.к использую ассоциативные массивы (+ динамические)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя csnet
сообщение 28.4.2014, 1:24
Сообщение #2
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

юзаешь trie ? ну нваулт нормально же сохраняет


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
exec1337
сообщение 28.4.2014, 1:24
Сообщение #3
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

https://c-s.net.ua/forum/index.php?showtopic=60712
?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 1:26
Сообщение #4


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Цитата(csnet @ 28.4.2014, 5:24) *
юзаешь trie ? ну нваулт нормально же сохраняет

насколько я помню nvault ключ и значение оба строковые варианты, у меня же, что то типа:

Код:
enum _:PlayerDataBase
{
Name[32],
SteamID[32],
iFrags,
iDeaths
}

new szData[PlayerDataBase];



Цитата(exec1337 @ 28.4.2014, 5:24) *

Спасибо, посмотрю что там, но все же хотелось разобраться с моим вопросом
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 1:32
Сообщение #5
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Я бы держал всю стату в памяти, загружая при старте карты и сохраняя при смене.
Тогда вопрос топика отпадает сам собой)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 1:34
Сообщение #6


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Цитата(Developer @ 28.4.2014, 5:32) *
Я бы держал всю стату в памяти, загружая при старте карты и сохраняя при смене.
Тогда вопрос топика отпадает сам собой)

Так и делаю. Все таки ищу оптимальное решение

Также вопрос, что лучше: Строка + ассоциативные массивы или перебор циклом и сравнение SteamID32
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 1:48
Сообщение #7
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Не уверен, что я правильно понимаю суть вопроса...
У тебя чтение и сохранение по одному разу за карту. И ты интересуешься, как оптимизировать эти операции. И как бы оно в файле не хранилось, в памяти всегда будет строка. Всё верно?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 2:02
Сообщение #8


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Цитата(Developer @ 28.4.2014, 5:48) *
Не уверен, что я правильно понимаю суть вопроса...
У тебя чтение и сохранение по одному разу за карту. И ты интересуешься, как оптимизировать эти операции. И как бы оно в файле не хранилось, в памяти всегда будет строка. Всё верно?

Верно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 2:14
Сообщение #9
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Тогда я бы действовал так:
• создал тестовый файл с 10-20k записей. Чем больше - тем лучше: показательнее будет;
• создал тестовый плагин с обоими вариантами загрузки/сохранения;
• профилировал его, получил бы суммарное время выполнения всех 4-х операций (StartProfile/StopProfile);
• параллельно зафиксировал нагрузку на CPU во всех 4 случаях (опционально);
• сделал выводы smile.gif



Цитата(Surf @ 28.4.2014, 3:20) *
2. В 32bit виде (4 байта)

Интересно было бы увидеть алгоритм. У меня получилось, что на SteamID нужно 4 байта.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 2:22
Сообщение #10


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Цитата(Developer @ 28.4.2014, 6:14) *
Тогда я бы действовал так:
• создал тестовый файл с 10-20k записей. Чем больше - тем лучше: показательнее будет;
• создал тестовый плагин с обоими вариантами загрузки/сохранения;
• профилировал его, получил бы суммарное время выполнения всех 4-х операций (StartProfile/StopProfile);
• параллельно зафиксировал нагрузку на CPU во всех 4 случаях (опционально);
• сделал выводы smile.gif

Можно линк подробней как замерить время выполнения функций? Пробовал через get_gametime() - выдавало одно и тоже время, ЧЯДНТ?

Цитата(Developer @ 28.4.2014, 6:14) *
Интересно было бы увидеть алгоритм. У меня получилось, что на SteamID нужно 4 байта.

4 байта != 4 байта? :D

STEAM_X:Y:Z
SteamID32bit = Z * 2 + Y
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 2:26
Сообщение #11
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(Surf @ 28.4.2014, 4:22) *
Можно линк подробней как замерить время выполнения функций? Пробовал через get_gametime() - выдавало одно и тоже время, ЧЯДНТ?

Склад маленького кода, блок 'Разбиение строки: parse/strbreak vs pawn', там пример на получение времени выполнения.

Цитата(Surf @ 28.4.2014, 4:22) *
4 байта != 4 байта? :D

Ахахх. Да я поначалу насчитал больше (отталкивался от пиратского ID), потом поправился, но уже успел забыть, какой размер получился у тебя)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя csnet
сообщение 28.4.2014, 2:31
Сообщение #12
Стаж: 12 лет

Сообщений: 4808
Благодарностей: 3849
Полезность: 690

небольшой оффтоп, у меня профайлер чето не идет, сервер крашит на винде.


go v cs:go
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 2:38
Сообщение #13
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Может ты его на неподдерживаемом билде AMXX используешь? Я на 1.8.2-dev hg26. Правда, у меня Windows 8.1.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 4:17
Сообщение #14


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Не выгодно устраивать пляски с бубном и гонять строку туда сюда, проще её использовать. Разница примерно в 40% :O
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 28.4.2014, 4:22
Сообщение #15
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

И всю базу при этом можно посмотреть 'невооружённым взглядом'. Одни плюсы)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
serfreeman1337
сообщение 28.4.2014, 4:33
Сообщение #16
Стаж: 13 лет

Сообщений: 912
Благодарности: выкл.

Код:
/* - Конверетер SteamID -> SteamID64 - */
new const VoogruMagicNumber[] = "76561197960265728"

steamIDToCommunityID(steamID[],communityID[sizeof VoogruMagicNumber]) {
const leftMaxLen = 8
const rightMaxLen = 20

new left[leftMaxLen];
new right[rightMaxLen];

strtok(steamID, left, leftMaxLen-1, right, rightMaxLen-1, ':')
strtok(right, left, leftMaxLen-1, right, rightMaxLen-1, ':')

new iServer = str_to_num(left);
new iAuthID = str_to_num(right);

const lastIndex = charsmax(VoogruMagicNumber) - 1
copy(communityID,charsmax(VoogruMagicNumber),VoogruMagicNumber)

new toAdd = iAuthID * 2 + iServer;

new toAddString[sizeof VoogruMagicNumber]
num_to_str(toAdd,toAddString,charsmax(VoogruMagicNumber));

new addLastIndex = strlen(toAddString) - 1;

for(new i=0;i<=addLastIndex;i++) {
new num = toAddString[addLastIndex - i] - 48;


new j=lastIndex - i;

do {
new num2 = communityID[j] - 48;
new sum = num + num2;

communityID[j] = (sum % 10) + 48;

num = sum / 10;

j--;
}
while(num);
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Surf
сообщение 28.4.2014, 13:09
Сообщение #17


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

serfreeman1337,
SteamID32 то выгоднее :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: