Непонятки с CHashMap из стандартной библиотеки - страница 2

 
Alexey Volchanskiy:

Насчет for можно подробнее? У тебя вижу только CObject GetNextNode(void);

Или сделать просто поиск в массиве?

Да, просто линейный поиск в массиве

Кстати, в generic реализации нет возможности даже перебрать элементы в CHashMap, так что не понимаю, как ее можно использовать в реальности.

 
Vasiliy Sokolov:

Да, просто линейный поиск в массиве. 

Кстати, в generic реализации нет возможности даже перебрать элементы в CHashMap, так что не понимаю, как ее можно использовать в реальности.

Типа foreach? У тебя есть CObject *GetNextNode(void), хотя я использовал только доступ по ключу

Вот первые данные по CHashMap, скоро и остальные сделаю и добавлю поиск

2018.02.21 16:27:12.049 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 3.1564 сек,  0.3156  мкс/объект

2018.02.21 16:27:12.588 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 0.5387 сек,  0.0539  мкс/объект


 

Данные теста CDictionary от Vasiliy Sokolov. Данные теста CHashMap считать недействительными, т.к. при поиске выдает ошибку. Пока не разобрался, почему.

2018.02.22 11:59:01.455 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 15.1775 сек,  1.5178  мкс/объект
2018.02.22 11:59:05.112 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 3.6547 сек,  0.3655  мкс/объект
2018.02.22 11:59:18.812 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 13.6994 сек,  1.3699  мкс/объект

------------------------------------------------------

#include <Arrays\dictionary.mqh>
#property script_show_inputs
input int PassCount = 10000000;

void CheckDictVS()
{
    CDictionary *hmap = new CDictionary(); 
    //CAvOrder * order = new CAvOrder(1, "EURUSD", ORDER_TYPE_BUY, 1, D'2018.02.21 12:44', 1.21354);
    CAvOrder * order = new CAvOrder;
    static ulong start, stop;
    start = GetMicrosecondCount();
    for(int n = 0; n < PassCount; n++)
    {
        if(!hmap.AddObject(n+1, (CObject*)order))
        {
            Print("Неудачный Add, итерация ", n+1);
            break;
        }
    }
    stop = GetMicrosecondCount();
    Print("Время добавления ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек,  ", DoubleToString((stop-start)/(double)PassCount, 4), "  мкс/объект" );

    start = GetMicrosecondCount();
    CObject* obj;
    for(int n = 0; n < PassCount; n++)
    {
        if(hmap.ContainsKey(n+1))
        {
            obj = hmap.GetObjectByKey(n+1);
            if(CheckPointer(obj) == POINTER_INVALID)
            {
                Print("Неудачный поиск, итерация ", n+1);
                break;
            }
        }    
        else
        {
            Print("Ключ не найден, итерация ", n+1);
            break;
        }
    }
    stop = GetMicrosecondCount();
    Print("Время поиска ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек,  ", DoubleToString((stop-start)/(double)PassCount, 4), "  мкс/объект" );

    start = GetMicrosecondCount();
    for(int n = 0; n < PassCount; n++)
    {
        hmap.DeleteObjectByKey(n+1);
    }
    stop = GetMicrosecondCount();
    Print("Время удаления ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек,  ", DoubleToString((stop-start)/(double)PassCount, 4), "  мкс/объект" );
    delete hmap;
    delete order;
}
 

Разобрался с CHashMap из стандартной библиотеки, однако шустрый!

2018.02.22 12:56:51.143 TestHashTable (EURUSD,M5) CheckHashMap()

2018.02.22 12:56:54.466 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 3.3208 сек,  0.3321  мкс/объект

2018.02.22 12:56:55.326 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 0.8599 сек,  0.0860  мкс/объект

2018.02.22 12:56:55.901 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 0.5742 сек,  0.0574  мкс/объект

2018.02.22 12:56:56.026 TestHashTable (EURUSD,M5) CheckDictVS()

2018.02.22 12:57:12.184 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 16.1584 сек,  1.6158  мкс/объект

2018.02.22 12:57:16.305 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 4.1205 сек,  0.4120  мкс/объект

2018.02.22 12:57:30.063 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 13.7580 сек,  1.3758  мкс/объект


 

При попытке скомпилировать Cdictionary под МТ4 получаю ошибку компиляции

'union' - declaration without type dictionary2.mqh 95 4

'casting_struct' - declaration without type dictionary2.mqh 111 4

2 error(s), 0 warning(s) 3 1

Я не понимаю, MQL4 не поддерживает union, что ли??? В MQL5 все компилится без проблем. И что вообще означает дурацкое сообщение "declaration without type"???

--------------

class CDictionary : public CObject
  {
private:
   int               m_array_size;
   int               m_total;
   bool              m_free_mode;
   bool              m_auto_free;
   int               m_index;
   ulong             m_hash;
   CList            *m_array[];
   union casting_struct              // Вот в этом union возникает ошибка!
   {
      double d_value;
      ulong  l_value;
   }casting;


 
Alexey Volchanskiy:

При попытке скомпилировать Cdictionary под МТ4 получаю ошибку компиляции

'union' - declaration without type dictionary2.mqh 95 4

'casting_struct' - declaration without type dictionary2.mqh 111 4

2 error(s), 0 warning(s) 3 1

Я не понимаю, MQL4 не поддерживает union, что ли??? В MQL5 все компилится без проблем. И что вообще означает дурацкое сообщение "declaration without type"???

--------------


Я у себя проверил - компилируется. Ищи где-то ещё ошибочку.
 

Alexey Volchanskiy:

И что вообще означает дурацкое сообщение "declaration without type"???

--------------


Часто такое выдаёт если ; где-то пропустил, или скобки не парные.

 

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

Как минимум, скорость вставок у CHashMap должна упасть.

 
Artyom Trishkin:

Часто такое выдаёт если ; где-то пропустил, или скобки не парные.

Артем, так у меня голый файл из статьи https://www.mql5.com/ru/articles/1334#summary не компилируется под МТ4, под МТ5 все ок.

Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
  • 2015.03.23
  • Vasiliy Sokolov
  • www.mql5.com
Эта статья описывает удобный класс для хранения информации - ассоциативный массив или словарь. Благодаря этому классу можно получать доступ к информации по ее ключу. Ассоциативный массив напоминает обычный массив, однако вместо индекса он использует некий уникальный ключ, например, перечисление ENUM_TIMEFRAMES или какой-либо текст. Что...
 
Mesaoria:

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

Как минимум, скорость вставок у CHashMap должна упасть.

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