오류, 버그, 질문 - 페이지 816

 
제 생각 에는 객체 멤버에 직접 액세스 하는 첫 번째 경우의 최적화가 있을 뿐입니다.

두 번째 경우에는 링크를 통한 간접 액세스가 있으며, 미세한 루프 본체를 사용하면 자연스럽게 절반의 시간이 걸리고 두 배로 늘어납니다.
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
이 테스트는 본질적으로 1억 번째 사이클에 배치된 하나의 어셈블러 명령어와 두 개의 어셈블러 명령어 간의 차이를 비교하는 것과 같이 다소 부정확합니다.
 
Renat :
제 생각 에는 객체 멤버에 직접 액세스 하는 첫 번째 경우의 최적화가 있을 뿐입니다.

두 번째 경우에는 링크를 통한 간접 액세스가 있으며, 미세한 루프 본체를 사용하면 자연스럽게 절반의 시간이 걸리고 두 배로 늘어납니다.

Renat, 실생활에서 많은 양의 데이터가 처리됩니다. 문제 영역을 보여주기 위해 이미 테스트를 단순화했습니다. 처음에는 배열과 클래스에서 수행했습니다. 그런 다음 다이어그램으로 잘라냈습니다.

즉, 사실 하나의 arr 객체가 아니라 복잡한 객체의 배열(배열 포함)이 있습니다.

이것은 대략 다음과 같이 도표로 작성할 수 있습니다.

 class A
{
   double prm1;
   int prm2;
   string prm3;
   char prm4;
}

class B
{
   A m_a[ 1000 ];
}

B _b[ 1000 ];



나는 당신이 배열 A의 특정 요소에 대한 참조를 얻는다면

А * item = GetPointer (_b[i]._a[j]);

그러면 A::prmX 매개변수 로 작업하는 것이 더 빠를 것입니다.


그러나 배열 이름에서 소시지를 뽑는다는 것이 밝혀졌습니다.

 _b[i]._a[j] .prmX  

특정 항목에 액세스하는 것보다 최소 2배 빠르게 실행됩니다.

이것은 조금 놀랐고 커널에서 일종의 의사 포인터가 수신되고 있다는 것이 분명해졌습니다.

최소한 속도의 차이를 줄이는 속도를 최적화할 수 있습니까?

 
sergeev :

이것은 오류없이 진행되는 방법입니다

이 테스트에는 오류가 없습니다. 그러나 이 방법은 기본적인 질문을 해결하지 못합니다. 컴파일러가 오류 및/또는 경고 없이 상수 개체 참조를 상수가 아닌 참조로 변환하는 것을 건너뛰는 이유는 무엇입니까? 이것이 그러한 기능이라면 질문은 없지만 클래스 메소드 의 서명에서 반환 유형에 대한 const 수정자의 의미는 손실됩니다.
 
mvk :
이 테스트에는 오류가 없습니다. 그러나 이 방법은 기본적인 질문을 해결하지 못합니다. 컴파일러가 오류 및/또는 경고 없이 객체 상수 참조를 상수가 아닌 참조로 변환하는 것을 건너뛰는 이유는 무엇입니까? 이것이 그러한 기능이라면 질문은 없지만 클래스 메소드 의 서명에서 반환 유형에 대한 const 수정자의 의미는 손실됩니다.

나는 그것이 모두 논리적이라고 생각합니다.

const 개체의 기능은 개체 자체를 변경해서는 안 되므로 const 수정자도 있어야 합니다.

하지만 약

   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();

예, 이것은 C++에서 허용되지 않습니다. 오류가 있을 것입니다.

서비스 데스크에 씁니다.

 
sergeev :

그러나 배열 이름에서 소시지를 뽑는다는 것이 밝혀 졌습니다.

특정 항목에 액세스하는 것보다 2배 이상 빠르게 실행됩니다.

실제로 더 빨리 밝혀졌습니까 아니면 다른 간단한 경우를 기반으로 한 출력의 논리적 구성입니까?

제 생각에는다차원 배열 에 대한 제시된 접근을 기반으로 한 순수한 증거는 아직 제시되지 않았습니다. 특히 솔직히 비싼 추가 GetPointer 기능이 제공됩니다.


이것은 조금 놀랐고 커널에서 일종의 의사 포인터가 수신되고 있다는 것이 분명해졌습니다.

MQL5에는 일반적인 의미의 포인터가 없으며 모든 후속 결과가 있는 핸들입니다.


최소한 속도의 차이를 줄이는 속도를 최적화할 수 있습니까?

최적화를 위해 지속적으로 노력하고 있지만 링크/핸들의 경우 간접 액세스에 대한 시스템 오버헤드가 있습니다.

어쨌든 우리는 그러한 액세스를 최적화하기 위해 더 자세히 살펴볼 것입니다.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Renat :

실제로 더 빨리 밝혀졌습니까 아니면 다른 간단한 경우를 기반으로 한 출력의 논리적 구성입니까?

예, 모두 매우 현실적입니다. 배열을 채우는 테스트를 거쳤습니다. 항상 두 배 느리게 나타났습니다.

제 생각에는 다차원 배열 에 대한 제시된 접근을 기반으로 한 순수한 증거는 아직 제시되지 않았습니다.

글쎄, 나는 구현 계획과 클래스 A, B 및 배열의 이미지를 배치했습니다.


특히 솔직히 비싼 추가 GetPointer 기능이 제공됩니다.

루프에 들어가기 전에 한 번 호출됩니다. 그러나 원칙적으로 더 정확한 테스트를 위해 GetTickCount에서 가져올 수도 있습니다.

어쨌든 우리는 그러한 액세스를 최적화하기 위해 더 자세히 살펴볼 것입니다.

확인. 감사하다. 이것이 필요한 것입니다.

 
sergeev :

루프에 들어가기 전에 한 번 호출됩니다. 그러나 원칙적으로 더 정확한 테스트를 위해 GetTickCount에서 가져올 수도 있습니다.

코드가 다음과 같다면 루프 밖에서 어떻게 될까요?
А * item = GetPointer (_b[i]._a[j]);
 
소망. 도움말에 텍스트의 크기를 늘리는 기능을 포함할 수 있습니까? 예를 들어 + 또는 - 또는 Ctrl+마우스 휠.
 
paladin800 :
소망. 도움말에 텍스트의 크기를 늘리는 기능을 포함할 수 있습니까? 예를 들어 + 또는 - 또는 Ctrl+마우스 휠.

아마도 이것은 불가능합니다. 온라인 버전이 작동하지 않습니까?

이 주제에 대해 인터넷에서 찾은 내용은 다음과 같습니다. http://forum.ru-board.com/topic.cgi?forum=62&topic=20907

업데이트 더 http://forum.ixbt.com/topic.cgi?id=23:39211

Невозможно изменить размер шрифта при просмотре .CHM файлов. :: Microsoft Windows :: Компьютерный форум Ru.Board
  • forum.ru-board.com
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору