PROFI에서 SUPERPROFI에 대한 모든 질문 - 1. - 페이지 8

 
C-4 :

여기에서 Adler32 해시 함수의 작동 예를 간단히 살펴보았습니다.

함수의 주요 코드는 Wikipedia에서 가져오고 MQL5에 대해 약간 수정되었습니다. 다음은 스크립트의 출력입니다.

보시다시피, 문자열 자체는 크게 다르지 않지만 함수에서 제공하는 모든 값은 완전히 다릅니다.

uint가 아닌 ulong이 필요한 이유는 무엇입니까?

그리고 이 함수에서 배열을 사용하는 작업은 매우 비효율적입니다. 코드를 현대화하고 유니코드를 두 개의 독립적인 문자로 분해하는 것이 더 쉽습니다. 50배 더 빠릅니다.

 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);
  }
3681ms 대 13822ms, 300만 번 실행.... 단 4배 차이... 그러나 변환 손실 없음
 

예, 정확히는 32비트가 정수가 아니라 long이기 때문입니다. 솔직히 말해서, 나는 여전히 64비트 버전용 해시 함수를 다시 만들 것입니다. 그래도 충돌 확률은 적은 것 같고, 전문가의 마법을 조절하기 쉬운 편이다. 반면에 현재 구현은 MQL4와 완벽하게 호환되지만(결국 long 유형 이 없음)

추신 : 루프 전에 문자열을 uchar 배열로 변환하고 이미 루프에 있는 배열의 값을 순차적으로 정렬하면 더 빠르지 않을까요? 그래도 루프에서 매번 StringGetCharacter(buf, n)를 호출하는 것은 매우 비용이 많이 든다고 생각합니다.

 
C-4 :

예, 정확히는 32비트가 정수가 아니라 long이기 때문입니다. 솔직히 말해서, 나는 여전히 64비트 버전용 해시 함수를 다시 만들 것입니다. 그래도 충돌 확률은 적은 것 같고, 전문가의 마법을 조절하기 쉬운 편이다. 반면에 현재 구현은 MQL4와 완벽하게 호환되지만(결국 long 유형이 없음)

추신 : 루프 전에 문자열을 uchar 배열로 변환하고 이미 루프에 있는 배열의 값을 순차적으로 정렬하면 더 빠르지 않을까요? 그래도 루프에서 매번 StringGetCharacter(buf, n)를 호출하는 것은 매우 비용이 많이 든다고 생각합니다.

알고리즘은 32비트 가능하다는 것을 알고 있습니다.

그리고 주기 전의 변환에 대해 - 어때요? 그러면 배열이 필요합니다 ... 동적 할당 ... 예, 변환할 때 정보가 손실됩니다.

 
AlexSTAL :

알고리즘은 32비트 가능하다는 것을 알고 있습니다.

보다 정확하게는 각 블록 길이에 대해 "좋은" 해싱 속성, 즉 입력 세트를 해시 세트에 다소 균일하게 매핑합니다.
 
AlexSTAL :
3681ms 대 13822ms, 300만 번 실행.... 단 4배 차이... 그러나 변환 손실 없음

작업 dat % 256dat & 0xFFs = (...)%65521로 대체되면 훨씬 더 빠릅니다. s = (...)로 확장하십시오. if(s>=65521) s-=65521;


 

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

다음은 주기 전의 일반 변환입니다.

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

다시 말하지만 이 기능은 MQL5에서만 사용할 수 있습니다. 그리고 정보 손실은 유니코드 --> ASCII에서 발생하며 이는 상당히 수용 가능한 수준입니다.

 
C-4 :

다음은 주기 전의 일반 변환입니다.

다시 말하지만 이 기능은 MQL5에서만 사용할 수 있습니다. 그리고 정보 손실은 유니코드 --> ASCII에서 발생합니다. 이는 상당히 수용 가능 합니다.

글쎄요 ... 특정 작업에서는 이것이 허용되지만 알고리즘에는 허용되지 않습니다.

64비트 알고리즘 MaHash8v64 (ulong)를 자세히 살펴보고 동시에 두 개를 묶는 것이 더 나을 것입니다(적어도 내가 직접 할 것입니다).

그리고 MQL4에는 유니코드가 없고 문제가 없습니다...

PS StringGetCharacter는 상당히 빠른 함수이며 원하는 위치에서 WORD( MQL5 약칭 )를 반환합니다. 문자열과 전혀 작동하지 않습니다

 

누구든지 VS 응용 프로그램 C++ Windows 프로젝트가 있는 경우 버전 10이 바람직합니다. 프로젝트는 작업에서 dll을 사용해야 합니다. 템플릿으로 사용하겠습니다.

dll은 MLP2HL.dll이라고 하는 것이 바람직합니다.

미리 감사드립니다.

 
joo :

누구든지 VS 응용 프로그램의 C++ Windows 프로젝트가 있는 경우 버전 10이 바람직합니다. 프로젝트는 작업에서 dll을 사용해야 합니다. 템플릿으로 사용하겠습니다.

dll은 MLP2HL.dll이라고 하는 것이 바람직합니다.

미리 감사드립니다.

템플릿은 다음과 같습니다. ...\MetaTrader 4\experts\samples\DLLSample

VS 2010이 자동으로 변환합니다. 이름은 변경할 수 있습니다.
 
Zhunko :

템플릿은 다음과 같습니다. ...\MetaTrader 4\experts\samples\DLLSample

VS 2010이 자동으로 변환합니다. 이름은 변경할 수 있습니다.

아니요, 이 템플릿 dll에 대해 알고 있습니다. :)

dll을 디버깅할 수 있도록 dll 소스가 포함된 exe 프로젝트 템플릿이 필요합니다. dll은 실행할 수 없으며 누군가가 호출해야 합니다. VS용 Intel Parallel Studio 2011을 공부하기로 결정했습니다.