Udostępnij za pośrednictwem


Optymalizacja stanu trwałego i inicjalizacji

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

Takie podejście ma tę zaletę, że pojedynczy DoPropExchange wykonania może służyć inicjowania, trwałość w formacie binarnym i trwałość w formacie tak zwane "-zbiór właściwości" używane przez niektóre kontenery.Ta funkcja jeden zawiera wszystkie informacje dotyczące właściwości i ich wartości domyślne w jednym wygodnym miejscu.

Jednak ta ogólności wiąże się z pogorszeniem efektywności.PX_ funkcje Pobierz ich elastyczność poprzez wielowarstwowego implementacji, które są z natury mniej skuteczne niż bardziej bezpośredni, ale mniej elastyczne podejścia.Ponadto jeśli formant przechodzi wartość domyślną, aby PX_ funkcjonować, że domyślny należy podać 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), a następnie ekstra, niepotrzebnej pracy odbywa się w przypadkach, gdy nie jest używana wartość domyślna.

Można poprawić wydajność binarne trwałość swojej kontroli przez zastąpienie sieci sterowania Serialize funkcji.Domyślna implementacja tej funkcji członka sprawia, że połączenie z DoPropExchange funkcji.Przez zastąpienie go, może dostarczyć bardziej bezpośrednie wykonania na trwałość binarne.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 trwały stan formantu jest ładowania lub zapisywania.Zmiennej tej można używać zamiast telefonicznej CPropExchange::GetVersion.

Aby zaoszczędzić miejsce na mały w formacie trwałych dla BOOL właściwości (i zachować zgodne 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 zmiennej tymczasowej jest używany i przypisywana jest jej wartość, a nie oddał m_boolProp do BAJT odniesienia.Technika odlewania spowodowałoby tylko jeden bajt m_boolProp modyfikowany, pozostawiając pozostałe bajty odinicjowany.

Dla samego formantu, można zoptymalizować inicjowania kontroli przez zastąpienie 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ła zastąpiona, DoPropExchange funkcji należy niszczyć ponieważ nadal jest używane dla trwałości w formacie zbioru właściwości.Jest ważne, aby zachować wszystkie trzy z tych funkcji zapewnienie kontroli konsekwentnie, zarządza jej właściwości, niezależnie od tego, które trwałość używa mechanizmu kontenera.

Zobacz też

Koncepcje

Formanty MFC ActiveX: optymalizacja