주어진 요소의 배열 지우기 - 페이지 16

 
Taras Slobodyanik :

플래그가 성공적으로 일치했다고 생각합니다.
http://osinavi.ru/asm/4.php

추가 연산자/비교를 위해...

프로파일링을 통해 확인했습니다. 비교, 할당 및 매트 연산의 수가 동일합니다.
 
Nikolai Semko :

내가 이해하지 못한 실행 시간의 차이로 돌아갑니다 . 논리와 검사 횟수 및 두 사이클의 합이 거의 100% 동일합니다.


나는 이미 위에서 썼습니다 - 나는 내 코드에서 더 적은 비교 연산을 얻었습니다 ...

------

과외 활동에서, 90년대 어딘가:

1) (조건) A, B, C가 독립적인 경우 확률이 증가하면 AND 함수로, 감소하면 OR 함수로 밀어넣어야 합니다.

종속적이면 하나의 표현식으로 결합될 수 없습니다(즉, do if (A && B) ).

2) 중첩된 주기 A, B가 있는 경우 외부 주기는 더 짧아야 합니다.

3) 루프 내부에 조건이 있는 경우 가능하면 루프를 나누어 조건을 제거해야 합니다.

 
Maxim Kuznetsov :

나는 이미 위에서 썼습니다 - 나는 내 코드에서 더 적은 비교 연산을 얻었습니다 ...

------

과외 활동에서, 90년대 어딘가:

1) (조건) A, B, C가 독립적인 경우 확률이 증가하면 AND 함수로, 감소하면 OR 함수로 밀어넣어야 합니다.

종속적이면 하나의 표현식으로 결합될 수 없습니다(즉, do if (A && B) ).

2) 중첩 루프 A,B가 있는 경우 외부 루프는 더 짧아야 합니다.

3) 루프 내부에 조건이 있는 경우 가능하면 루프를 나누어 조건을 제거해야 합니다.


1) 반대로, 당신이 한. C에서 조건부 연산자 실행의 특징. 복합 AND 연산자 의 첫 번째 조건이 실행되지 않는 경우 다른 모든 조건을 확인하는 이유는 무엇입니까? 따라서 가장 먼저 거짓일 가능성이 높은 조건을 확인합니다.

네, 그렇습니다. 복합 조건에서 진술의 참 확률이 오름차순으로 정렬됩니다.

 
Алексей Тарабанов :

1) 반대로, 당신이 한. C에서 조건문 실행의 특징

제가 잘못 썼을 수도 있지만, 모두가 바로 설명하는 것이 어떻게 더 명확할까요 ...

에이앤비앤씨

AND는 다른 모든 조건을 거치지 않도록 가능한 한 빨리 실패해야 합니다. 즉, 전체 추가 체인의 실행을 중단시키는 첫 번째 술어가 배치됩니다. 프로그래머용 옵티마이저는 프로그램이 실행되는 데이터가 무엇인지 모르기 때문에 이 작업(*)을 수행하지 않습니다.

에이 || 나 || 씨

부울 산술이기 때문에 반대입니다 :-) !( (!A)&&(!B)&&(!C) )

*) 최적화 컴파일러는 조건이 이러한 방식으로 설정된다는 사실에 의존할 수 있으며 이러한 가정에 따라 내부 키친을 구축할 수 있습니다.

 
Maxim Kuznetsov :

제가 잘못 썼을 수도 있지만, 모두가 바로 설명하는 것이 어떻게 더 명확할까요 ...

에이앤비앤씨

AND는 다른 모든 조건을 거치지 않도록 가능한 한 빨리 실패해야 합니다. 즉, 전체 추가 체인의 실행을 중단시키는 첫 번째 술어가 배치됩니다. 프로그래머용 옵티마이저는 프로그램이 실행되는 데이터가 무엇인지 모르기 때문에 이 작업(*)을 수행하지 않습니다.

에이 || 나 || 씨

부울 산술이기 때문에 반대입니다 :-) !( (!A)&&(!B)&&(!C) )

*) 최적화 컴파일러는 조건이 이러한 방식으로 설정된다는 사실에 의존할 수 있으며 이러한 가정에 따라 내부 키친을 구축할 수 있습니다.

완전히 동의합니다.

 
Nikolai Semko :

내가 이해하지 못한 실행 시간의 차이로 돌아갑니다 . 논리와 검사 횟수 및 두 사이클의 합이 거의 100% 동일합니다.

그래서 나는 Kuznetsov의 코드에서 그러한 옵션을 반복합니다.

정확히 동일한 작업을 수행하는 이것보다 두 배 이상 빠르게 작동합니다.

컴파일러의 놀라운 점은 무엇입니까?
정말 그런 디자인을 위해:

컴파일러가 프로세서에 대한 특별한 어셈블러 검색 명령을 찾았습니까? 그러나 내부에 추가 검사 i<j가 있습니까?

결국 동일한 작업이 다음을 통해 눈에 띄게 느려집니다.

첨부된 것은 시연 스크립트 코드입니다.

그런 일이 자주 발생합니다. 당신은 불필요한 쓰레기를 만들고 자신에게 매우 흥미로운 것을 찾는 것 같습니다.

개발자 여러분, 실행 가능한 코드를 볼 수 있습니까? 왜 그런 차이가 있습니까?

결국, 미래에 더 최적의 알고리즘을 만들기 위해서는 컴파일러의 논리를 이해해야 합니다.

일반적으로 이상한 상황입니다. 테스트가 수행되는 컴퓨터와 컴파일러에 따라 많이 달라집니다. 다음은 32비트 컴퓨터에서 수행한 예제의 결과입니다.

하나


보시다시피 특별한 이점은 없습니다. 그리고 다음은 마지막 옵션에서 배열에서 삭제하는 기능의 테스트입니다.

2

 
또한 때때로 테스트 중에 결과가 이전 결과와 매우 다를 수 있으며 이것이 무엇과 연결되어 있는지 명확하지 않습니다. 아마도 MQL에서 코드를 처리할 때 일부 특정 인터럽트 시스템일 것입니다.
 
Stanislav Dray :
또한 때때로 테스트 중에 결과가 이전 결과와 매우 다를 수 있으며 이것이 무엇과 연결되어 있는지 명확하지 않습니다. 아마도 MQL에서 코드를 처리할 때 일부 특정 인터럽트 시스템일 것입니다.

알고리즘을 테스트할 때 다음을 수행해야 합니다.

* 또는 미리 준비된 데이터 세트(실제로 필요한 것과 거의 유사),

* 또는 RNG에서 매우 많은 수의 패스를 만들거나,

테스트에서:

* 테스트 순서를 번갈아 가며 섞습니다.

* 일시 중지 관찰 및 모든 종류의 캐시 재설정

 
Maxim Kuznetsov :

알고리즘을 테스트할 때 다음을 수행해야 합니다.

* 또는 미리 준비된 데이터 세트(실제로 필요한 것과 거의 유사),

* 또는 RNG에서 매우 많은 수의 패스를 만들거나,

테스트에서:

* 테스트 순서를 번갈아 가며 섞습니다.

* 일시 중지 관찰 및 모든 종류의 캐시 재설정



음, 미리 준비된 데이터를 어떻게 사용할까요? 모든 기능을 테스트하는 데 동일한 데이터가 사용됩니다. 하지만 셔플/교대를 희생하면서 예. 테스트 순서를 변경하면 차이가 있음을 알았습니다. 그러나 캐시를 재설정하는 방법은 무엇입니까?

 
Maxim Kuznetsov :

알고리즘을 테스트할 때 다음을 수행해야 합니다.

* 또는 미리 준비된 데이터 세트(실제로 필요한 것과 거의 유사),

* 또는 RNG에서 매우 많은 수의 패스를 만들거나,

테스트에서:

* 테스트 순서를 번갈아 가며 섞습니다.

* 일시 중지 관찰 및 모든 종류의 캐시 재설정



사람들을 괴롭힐 필요가 없습니다.