PROFI'den SUPERPROFI'ye kadar tüm sorularınız - 1. - sayfa 8

 
C-4 :

Burada Adler32 karma işlevinin çalışan bir örneğini kırptım:

Fonksiyonun ana kodu Wikipedia'dan alınmıştır ve MQL5 için biraz değiştirilmiştir. İşte betiğin çıktısı:

Gördüğünüz gibi, işlev tarafından verilen tüm değerler tamamen farklıdır, ancak dizelerin kendileri çok farklı değildir.

Neden ulong ve uint değil?

Ve bu fonksiyondaki dizilerle yapılan işlem son derece verimsizdir. Kodu modernize etmek ve unicode'u iki bağımsız karaktere ayırmak daha kolay - 50 kat daha hızlı olacak

 uint adler32__( string buf)
  {
     uint s1 = 1 ;
     uint s2 = 0 ;
     uint buflength= StringLen (buf);
     ushort dat;
     for ( uint n= 0 ; n<buflength; n++)
     {
        dat = StringGetCharacter (buf, n);
        s1 = (s1 + (dat % 256 )) % 65521 ;
        s2 = (s2 + s1)     % 65521 ;
        s1 = (s1 + (dat>> 8 )) % 65521 ;
        s2 = (s2 + s1)     % 65521 ;
     }
     return ((s2 << 16 ) + s1);
  }
3 milyon çalıştırmada 13822 ms'ye karşı 3681 msn.... sadece 4 kat fark... ancak dönüşüm kaybı yok
 

Evet, kesinlikle, çünkü 32 bit bir tam sayıdır ve uzun değildir. Dürüst olmak gerekirse, 64 bit sürüm için karma işlevini yine de yeniden yapardım. Yine de, çarpışma olasılığı daha az gibi görünüyor ve bir uzmanın büyüsünü ayarlamak kolay. Öte yandan, mevcut uygulama MQL4 ile tamamen uyumlu olmasına rağmen (sonuçta içinde uzun tip yok)

PS Döngüden önce dizeyi uchar dizisine dönüştürürseniz ve döngüde zaten dizi değerleri üzerinde yinelenirseniz daha hızlı olmaz mıydı? Yine de, bir döngüde her zaman StringGetCharacter(buf, n) çağırmanın çok pahalı olduğunu düşünüyorum.

 
C-4 :

Evet, kesinlikle, çünkü 32 bit bir tam sayıdır ve uzun değildir. Dürüst olmak gerekirse, 64 bit sürüm için karma işlevini yine de yeniden yapardım. Yine de, çarpışma olasılığı daha az gibi görünüyor ve bir uzmanın büyüsünü ayarlamak kolay. Öte yandan, mevcut uygulama MQL4 ile tamamen uyumlu olmasına rağmen (sonuçta içinde uzun tip yok)

PS Döngüden önce string'i uchar dizisine çevirirseniz ve zaten döngüde sıralı olarak dizinin değerlerine göre sıralarsanız daha hızlı olmaz mıydı? Yine de, bir döngüde her zaman StringGetCharacter(buf, n) çağırmanın çok pahalı olduğunu düşünüyorum.

Bu algoritmanın yalnızca 32 bit olabileceğini anlıyorum.

Ve döngüden önceki dönüşüm hakkında - nasıl? O zaman bir diziye ihtiyacınız olacak ... dinamik ayırma ... Evet ve dönüştürürken bilgi kaybolur

 
AlexSTAL :

Bu algoritmanın yalnızca 32 bit olabileceğini anlıyorum.

Daha doğrusu, her blok uzunluğu için, "iyi" hash özelliklerine sahip olacak karakteristik bir polinom seçmek gerekir, yani. girdi kümesini karma kümesiyle aşağı yukarı eşit olarak eşleyin.
 
AlexSTAL :
3 milyon çalıştırmada 13822 ms'ye karşı 3681 msn.... sadece 4 kat fark... ancak dönüşüm kaybı yok

dat % 256 işleminin yerine dat & 0xFF ve s = (...)%65521; s = (...); if(s>=65521) s-=65521;


 

А по поводу конвертации перед циклом - это как? Вам массив тогда понадобится... динамическое распределение... Да и при конвертации происходит потеря информации

İşte döngüden önceki düzenli dönüşüm:

 uchar array[];
ArrayResize (array, buflength, 0 );
StringToCharArray (buf, array, 0 , - 1 , CP_ACP);
// Дальше идет цикл

Doğru, yine bu işlev yalnızca MQL5'te mevcuttur. Ve anladığım kadarıyla bilgi kaybı, oldukça kabul edilebilir olan Unicode --> ASCII ile gerçekleşir.

 
C-4 :

İşte döngüden önceki düzenli dönüşüm:

Doğru, yine bu işlev yalnızca MQL5'te mevcuttur. Ve anladığım kadarıyla bilgi kaybı, oldukça kabul edilebilir olan Unicode --> ASCII ile gerçekleşir .

Eh, evet ... sadece bu sizin özel görevinizde sizin için kabul edilebilir, ancak algoritma için değil.

64-bit MaHash8v64 (ulong) algoritmasına daha yakından bakın ve muhtemelen aynı anda iki grupta daha iyi (en azından kendim yapacağım)

Ve MQL4'te Unicode yok, sorun yok...

PS StringGetCharacter oldukça hızlı bir işlevdir, istenen konumdan yalnızca bir WORD ( MQL5 için ushort ) döndürür, yani. dize ile hiç çalışmıyor

 

Herhangi birinin bir VS uygulamasının C++ windows projesi varsa, tercihen sürüm 10 için. Projenin çalışmasında dll'yi kullanması gerekir. Şablon olarak kullanacağım.

Dll'nin MLP2HL.dll olarak adlandırılması arzu edilir.

Şimdiden teşekkürler.

 
joo :

Herhangi birinin bir VS uygulamasının C++ windows projesi varsa, tercihen sürüm 10 için. Projenin çalışmasında dll'yi kullanması gerekir. Şablon olarak kullanacağım.

Dll'nin MLP2HL.dll olarak adlandırılması arzu edilir.

Şimdiden teşekkürler.

Şablon burada: ...\MetaTrader 4\experts\samples\DLLSample

VS 2010 bunu otomatik olarak dönüştürecektir. İsim değiştirilebilir.
 
Zhunko :

Şablon burada: ...\MetaTrader 4\experts\samples\DLLSample

VS 2010 bunu otomatik olarak dönüştürecektir. İsim değiştirilebilir.

Hayır, bu şablon dll'yi biliyorum. :)

Dll'nin hatalarının ayıklanabilmesi için projesi dll kaynaklarını içeren bir exe proje şablonuna ihtiyacım var. dll yürütülebilir değildir ve birisi tarafından çağrılmalıdır. VS için Intel Parallel Studio 2011'i incelemeye karar verdim.