Udostępnij za pośrednictwem


Optymalizacja trwałości i inicjalizacja

Domyślnie, trwałości i inicjowania w formancie są obsługiwane przez DoPropExchange funkcji składowej.W typowych formantów, ta funkcja zawiera kilka wywołań PX_ funkcje (PX_Color, PX_Fonti tak dalej), jeden dla każdej właściwości.

Takie podejście ma tę zaletę, że pojedynczy DoPropExchange wdrażania można inicjowania, trwałość w formacie binarnym i trwałość w formacie tak zwane "właściwość bag" używane przez niektóre kontenery.Ta funkcja jeden zawiera wszystkie informacje dotyczące właściwości i wartości domyślnych w jednym wygodnym miejscu.

Jednakże tym rezerwom pochodzi kosztem efektywności.PX_ funkcje get ich elastyczność poprzez wielowarstwowego implementacji, które są nieodłącznie mniej skuteczne niż bardziej bezpośrednie, ale mniej elastyczne podejścia.Ponadto jeśli formant przekazuje wartość domyślną dla PX_ działać, że domyślna musi być podana wartość zawsze, nawet w sytuacji, gdy wartość domyślna nie musi być używana.Jeśli generowania wartością domyślną jest proste zadania (na przykład, jeśli wartość jest uzyskiwany z otoczenia właściwości), następnie ekstra, niepotrzebne praca jest wykonywana w przypadkach gdy nie jest stosowana wartość domyślna.

Można poprawić wydajność binarne trwałości programu kontroli nadrzędnym Jeśli formant Serialize funkcji.Domyślna implementacja tej funkcji Członkowskich dzwoni do użytkownika DoPropExchange funkcji.Przez zastąpienie go, można zapewnić bardziej bezpośrednie wprowadzenie w życie dla trwałości binarny.Na przykład, rozważmy to DoPropExchange funkcji:

void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
   PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
   PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF,0x00,0x00));
   PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}

Aby zwiększyć wydajność binarne trwałość tego formantu, można zastąpić Serialize działają w następujący sposób:

void CMyAxOptCtrl::Serialize(CArchive& ar)
{ 
    SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
    SerializeExtent(ar);
    SerializeStockProps(ar);

    if (ar.IsLoading())
    {
        ar >> m_BoolProp;
        ar >> m_ShortProp;
        ar >> m_ColorProp;
        ar >> m_StringProp;
    }
    else
    {
        ar << m_BoolProp;
        ar << m_ShortProp;
        ar << m_ColorProp;
        ar << m_StringProp;
    }
}

dwVersion Zmienna lokalna może służyć do wykrywania wersji formantu stanu są załadowane lub zapisywane.Zmiennej tej można używać zamiast wywołania CPropExchange::GetVersion.

Aby zaoszczędzić trochę trwałe format dla BOOL właściwości (i być zgodny z formatem produkowane przez PX_Bool), można zapisać właściwość jako BAJT, w następujący sposób:

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

Zauważ, że w przypadku obciążenia tymczasowych zmiennych i przypisywana jest wartość, zamiast rzutowanie m_boolProp do BAJT odniesienia.Technika odlewania spowodowałoby tylko jeden bajt m_boolProp modyfikowane, pozostawiając pozostałe bajty odinicjowany.

Dla samego formantu, można zoptymalizować Zainicjowanie formantu nadrzędnym COleControl::OnResetState w następujący sposób:

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF,0x00,0x00);
   m_StringProp.Empty();
}

Chociaż Serialize i OnResetState został zastąpiony, DoPropExchange funkcja powinna pozostać nienaruszone, ponieważ jest używany dla trwałości w formacie zbioru właściwości.Jest ważne, aby zachować wszystkie trzy z tych funkcji do zapewnienia kontroli konsekwentnie, zarządza jej właściwości niezależnie od których trwałość używa mechanizmu kontenera.

Zobacz też

Koncepcje

Formanty ActiveX MFC: Optymalizacja