purebasic.info

PureBasic forum
Текущее время: Чт дек 14, 2017 12:51 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: NewMap
СообщениеДобавлено: Ср сен 27, 2017 10:29 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
на одном из форумов подсказали полистать описание Ассоциативных массивов и я для себя открыл америку что и для PB это как бы есть.
https://ru.wikipedia.org/wiki/%D0%90%D1 ... #PureBasic

вот там смотрю и не верю своим глазам - никаких номеров в массиве, а указателем может являться метка.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  Structure Car ; Описание структуры.
    Weight.l
    Speed.l
    Price.l
  EndStructure
 
  NewMap Cars.Car() ; Создание структурированного ассоциативного массива.
 
  ; Заполнение массива данными.
  Cars("Ferrari F40")\Weight = 1000
  Cars()\Speed = 320
  Cars()\Price = 500000
 
  Cars("Lamborghini Gallardo")\Weight = 1200
  Cars()\Speed = 340
  Cars()\Price = 700000
 
  ; Перебор всех элементов с отображением их значений в отладочном окне.
  ForEach Cars()
    Debug "Car name: "+MapKey(Cars()) ; Имя ключа текущего элемента массива.
    Debug "Weight: "+Str(Cars()\Weight)
  Next



поскольку я все равно остаюсь в сомнении и подозрительности - а не спрятано ли внутри этой самой фичи банального цикла for? не тестировал ли кто на быстродействие данной фичи, чтобы точно выявить это for или все-таки что-то оригинальное и очень быстрое? просто я видел два пути для ведения базы:
есть файл. 3 строки. на самом деле 30 тыщ скажем.
Код:
1
2
3
id="3" mob="skelet"
id="5" mob="zombi"
id="6" mob="vampir"



первый вариант, массив меньше, но время доступа больше из-за необходимости цикла для кручения айди по массиву в поисках нужного:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Enumeration
  #File
EndEnumeration
 
Structure mob
  id.i
  name$
  spoilflag.a
  atackflag.a
EndStructure
 
Dim Moby.mob(0)
 
 
If ReadFile(#File, "D:\moblist.txt")
  ; мотать файл до конца
  While Eof(#File) = 0
    ; обнуление переменных
    id = 0
    name$ = ""
   
    ; читать строчку текста до символа перевода каретки
    tmp$ = ReadString(#File)
   
    ; разбор строчки текста
    id = Val(StringField(tmp$, 2, Chr(34)))
    ; Val() - превращение текста в цифру
    ; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
    ; и возврат 2 блока при разбитии
    ; сама текстовая строка выглядит так:
    ; id="3" mob="skelet"
    ; при разбитии по кавычкам:
    ; id=    1 блок
    ; 3      2 блок
    ;  mob=  3 блок
    ; skelet 4 блок
   
    name$ = StringField(tmp$, 4, Chr(34))
   
    If name$
      ; если в переменной name$ что-то есть,
      ; то значит разбор прошел успешно
      ; надо увеличить массив на 1 единичку
      size = ArraySize(Moby()) + 1
      ReDim Moby(size)
     
      ; и внести туда данные
      Moby(size)\id    = id
      Moby(size)\name$ = name$
     
    EndIf
   
  Wend
 
  ; закрыть открытый файл
  CloseFile(#File)
EndIf
 
; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3
 
; то получаем о них инфу:
For i = 0 To ArraySize(Moby())
  If mobid = Moby(i)\id
    Debug Moby(i)\name$
    Break
  EndIf
Next




вариант второй, который мне больше нравится, но массив будет дико большим.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Enumeration
  #File
EndEnumeration
 
Structure mob
  ;id.i id в структуре становится не нужен. удаляем
  name$
  spoilflag.a
  atackflag.a
EndStructure
 
Dim Moby.mob(0)
 
 
If ReadFile(#File, "D:\moblist.txt")
  ; мотать файл до конца
  While Eof(#File) = 0
    ; обнуление переменных
    id = 0
    name$ = ""
   
    ; читать строчку текста до символа перевода каретки
    tmp$ = ReadString(#File)
   
    ; разбор строчки текста
    id = Val(StringField(tmp$, 2, Chr(34)))
    ; Val() - превращение текста в цифру
    ; StringField - разбитие текста tmp$, по символу - Chr(34), то есть это кавычки
    ; и возврат 2 блока при разбитии
    ; сама текстовая строка выглядит так:
    ; id="3" mob="skelet"
    ; при разбитии по кавычкам:
    ; id=    1 блок
    ; 3      2 блок
    ;  mob=  3 блок
    ; skelet 4 блок
   
    name$ = StringField(tmp$, 4, Chr(34))
   
    If name$
      ; если в переменной name$ что-то есть,
      ; то значит разбор прошел успешно
      ; надо увеличить массив до числа id
      size = ArraySize(Moby())
      If size < id
        ReDim Moby(id)
      EndIf
     
      ; и внести туда данные
      Moby(id)\name$ = name$
     
    EndIf
   
  Wend
 
  ; закрыть открытый файл
  CloseFile(#File)
EndIf
 
; теперь когда массив готов и приходят с сервера id мобов,
mobid = 3
 
; то получаем о них инфу без цикла, используя id как номер в массиве:
Debug Moby(mobid)\name$



вот этот NewMap очень похож на мой второй случай, который мне нравится... но без недостатка в преувеличенном размере массива. но что-то я в сомнении, слишком уж все хорошо складывается :) - уж не спрятан ли там банальный for внутри PB при работе этой самой NewMap?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 6:32 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 527
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
картами пользуюсь изначально, очень удобная штука, а массивами не пользуюсь, их реализация в РВ, ну тут без комментов.
SereZa писал(а):
а не спрятано ли внутри этой самой фичи банального цикла for?

а как без цикла перебрать все элементы? цикл есть, вопрос на каком он уровне? на уровне ассемблера или нет, отсюда и максимальная скорость


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 12:29 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
не, я не про перебор, а про запрос по конкретному маркеру чтоль... не скрывается ли за командой:
Debug Cars("Zaz")\Speed

на самом деле цикл типа:
Код:
1
2
3
4
5
  For i = 0 To ArraySize(Cars())
    If Cars(i)\id$ = "Zaz"
      Debug Cars("i")\Speed
    EndIf
  Next



понятно что id$ в структуре как бы и нет, но что-то у меня подозрения что там все-таки цикл по поиску названия и только потом вывод. слишком хорошо это выглядит чтоб быть правдой что такой быстрый доступ к этому ассоциативному массиву без перебора :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 12:31 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
newJS писал(а):
массивами не пользуюсь, их реализация в РВ, ну тут без комментов
Что не так с массивами?

SereZa писал(а):
не спрятан ли там банальный for внутри PB при работе этой самой NewMap
Судя по расположению элементов при выводе в цикле ForEach они как-то сортируются вероятно для более быстрого поиска. Но из-за того что ключ это строка, поиск может быть не такой быстрый как хотелось бы.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 1:44 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
что не так с массивами - например удаление ячейки по середине :) там потребует писанины кода и получается переформатированием массива, вместо какойнить быстрой DelArrayNum(Array(), num).

то есть этот метод NewMap все-таки имеет свои минусы по скорости. вот я и думал что слишком уж хорошо все выглядит чтоб содержать одни плюсы без минусов :) а так да, очень удобно что не нужно следить за размером массива, редимить при каждом нужном случае и удобно удалять.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 3:50 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11070
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
SereZa писал(а):
например удаление ячейки по середине там потребует писанины кода и получается переформатированием массива, вместо какойнить быстрой DelArrayNum(Array(), num)
DelArrayNum будет делать тоже самое.
Используй список, в котором предусмотрено удаление элементов.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Чт сен 28, 2017 8:02 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 369
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
В массиве для доступа к элементу по номеру используется примитивное вычисление для расчёта смещения данных в памяти. В картах используется цикл не хилого размера с кучей вложенных циклов (скорее всего используются не всегда), с вызовом системных функций, так что скорости ждать не стоит.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Пт сен 29, 2017 3:49 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 545
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Для быстрого доступа нужно конкретно знать что за данные будем хранить,вот в первом примере структура с типом без строк это хорошо,ежели с строками то нужно будет опредилиться данные в какой кодировки хранятся и максимальное возможное количество символов в строке.
После пишем на асме процедуры для доступа в памяти(если динамические данные) к этим данным.
Насколько критичный объём выделенной памяти сейчас на современных компах?
Если критично можно подумать в плоть до отдельного потока на обслуживание блока памяти,типа в неком интервале времени(пока основная прога не имеет запроса к этим данным) происходит обращение к участку памяти для анализа сколько реально данных в нём хранится и если меньше объём данных по сравнению выделенной памяти то урезает память. :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Пт сен 29, 2017 7:57 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 527
Благодарил (а): 51 раз.
Поблагодарили: 15 раз.
Пункты репутации: 5
SereZa писал(а):
не, я не про перебор, а про запрос по конкретному маркеру чтоль...

и я про это, элементы нужно перебирать, как это сделать без цикла
SereZa писал(а):
что не так с массивами - например удаление ячейки по середине

я выкладывал набор функций для работы с массивами
Пётр писал(а):
Что не так с массивами?

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

если смотреть порядок вывода, то увидим что местами поменялись лишь несколько элементов, в JS тоже самое
Пётр, язык знаешь, ну и сходи к нерусям, спроси у Феди, этот вопрос не первый раз вылезает, только как те темы найти, это уже другой вопрос


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: NewMap
СообщениеДобавлено: Пт сен 29, 2017 2:49 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1561
Откуда: Алматы
Благодарил (а): 12 раз.
Поблагодарили: 37 раз.
Пункты репутации: 5
так надо просто таймер чтоль... и сравнить. раз 10 запустить тот вариант и другой. там видно будет.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB