Скачать MetaTrader 5

Какой способ сравнения элементов строк быстрее (задача)?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью и она попадет в MetaTrader 5!
Sergey Pavlov
8952
Sergey Pavlov 2016.09.17 08:49 
  • 34%
    (13)
  • 11%
    (4)
  • 55%
    (21)
Всего проголосовало: 38
Sergey Pavlov
8952
Sergey Pavlov 2016.09.17 08:50  

Эксперементировал со строками как с массивами и решил выяснить. А что быстрее: строковые функции MQL5 или операции с массивами. Результат меня удивил...
Вот код теста:

void OnStart()
  {
//---
   int N1=0;
   int N2=0;
   string  str="+1-3*45/-678.9:10123456789qwertyuiop[]asdfghjkl;'zxcvbnm,.10123456789QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM/+1-3*45/-678.9:10123456789qwertyuiop[]asdfghjkl;'zxcvbnm,./10123456789qwertyuiop[]asdfghjkl;'zxcvbnm";
   string str1="+1-7*45/-678.9/10123456789qwertyuiop[]asdfghjkl;'zxcvbnm,.10123456789QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM/+1-3*45/-678.9:10123456789qwertyuiop[]asdfghjkl;'zxcvbnm,./10123456789qwertyuiop[]asdfghjkl;'zxcvbnm";
   string str2="+1-3)41/-678.9:10123456789QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.10123456789QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM/+1-3*45/-678.9:10123456789qwertyuiop[]asdfghjkl;'zxcvbnm,./10123456789qwertyuiop[]asdfghjkl;'zxcvbnm";
   int l=StringLen(str);
   Print(l);
   uint GTC=GetTickCount();
   for(int i=0;i<100000;i++)
     {
      for(int j=0;j<l;j++)
        {
         if(str1[j]==str[j])
            N1++;
         if(str2[j]==str[j])
            N1++;
        }
      for(int k=0;k<l;k++)
        {
         for(int t=0;t<l;t++)
           {
            if(str1[k]==str2[t])
               N2++;
           }
        }
     }
   Print("Время тестирования (массив)=",GetTickCount()-GTC," N1=",N1," N2=",N2);

   N1=0;
   N2=0;
   GTC=GetTickCount();
   for(int i=0;i<100000;i++)
     {
      for(int j=0;j<l;j++)
        {
         if(StringGetCharacter(str1,j)==StringGetCharacter(str,j))
            N1++;
         if(StringGetCharacter(str2,j)==StringGetCharacter(str,j))
            N1++;
        }
      for(int k=0;k<l;k++)
        {
         for(int t=0;t<l;t++)
           {
            if(StringGetCharacter(str1,k)==StringGetCharacter(str2,t))
               N2++;
           }
        }
     }
   Print("Время тестирования (строки)=",GetTickCount()-GTC," N1=",N1," N2=",N2);
  }
fxsaber
4486
fxsaber 2016.09.17 14:02  
Sergey Pavlov:

Эксперементировал со строками как с массивами и решил выяснить. А что быстрее: строковые функции MQL5 или операции с массивами. Результат меня удивил...
Вот код теста:

Строки - это НЕ массивы. Разработчики добавили только
ushort operator []( const uint Pos )
{
  return(::StringGetCharacter(this, Pos));
}
Инлайниться должно полностью, поэтому оба варианта идентичны. И поэтому Вы можете брать индекс ни только отрицательный, но и не целочисленный.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий