Bagikan melalui


Mengoptimalkan Persistensi dan Inisialisasi

Secara default, persistensi dan inisialisasi dalam kontrol ditangani oleh DoPropExchange fungsi anggota. Dalam kontrol umum, fungsi ini berisi panggilan ke beberapa fungsi PX_ (PX_Color, PX_Font, dan sebagainya), satu untuk setiap properti.

Pendekatan ini memiliki keuntungan bahwa implementasi tunggal DoPropExchange dapat digunakan untuk inisialisasi, untuk persistensi dengan format biner, dan untuk persistensi dalam format "property-bag" yang digunakan oleh beberapa kontainer. Fungsi yang satu ini menyediakan semua informasi tentang properti dan nilai defaultnya di satu tempat yang nyaman.

Namun, generalisasi ini mengorbankan efisiensi. Fungsi PX_ mendapatkan fleksibilitasnya melalui implementasi multilayer yang secara inheren kurang efisien daripada pendekatan yang lebih langsung, tetapi kurang fleksibel. Selain itu, jika kontrol meneruskan nilai default ke fungsi PX_ , nilai default tersebut harus disediakan setiap saat, bahkan dalam situasi ketika nilai default mungkin belum tentu digunakan. Jika menghasilkan nilai default adalah tugas nontrivial (misalnya, ketika nilai diperoleh dari properti sekitar), maka pekerjaan tambahan yang tidak perlu dilakukan dalam kasus di mana nilai default tidak digunakan.

Anda dapat meningkatkan performa persistensi biner kontrol dengan mengesampingkan fungsi kontrol Serialize Anda. Implementasi default fungsi anggota ini melakukan panggilan ke fungsi Anda DoPropExchange . Dengan mengesampingkannya, Anda dapat memberikan implementasi yang lebih langsung untuk persistensi biner. Misalnya, pertimbangkan fungsi ini DoPropExchange :

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(""));
}

Untuk meningkatkan performa persistensi biner kontrol ini, Anda dapat mengambil alih Serialize fungsi sebagai berikut:

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;
   }
}

Variabel dwVersion lokal dapat digunakan untuk mendeteksi versi status persisten kontrol yang dimuat atau disimpan. Anda dapat menggunakan variabel ini alih-alih memanggil CPropExchange::GetVersion.

Untuk menghemat sedikit ruang dalam format persisten untuk properti BOOL (dan membuatnya tetap kompatibel dengan format yang dihasilkan oleh PX_Bool), Anda dapat menyimpan properti sebagai BYTE, sebagai berikut:

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

Perhatikan bahwa dalam kasus beban, variabel sementara digunakan dan kemudian nilainya ditetapkan, daripada mentransmisikan m_boolProp ke referensi BYTE . Teknik casting hanya akan mengakibatkan satu byte dari m_boolProp yang dimodifikasi, sementara byte yang tersisa dibiarkan tidak diinisialisasi.

Untuk kontrol yang sama, Anda dapat mengoptimalkan inisialisasi kontrol dengan mengganti COleControl::OnResetState sebagai berikut:

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

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

Meskipun Serialize dan OnResetState telah ditimpa, fungsi DoPropExchange harus tetap utuh karena masih digunakan untuk persistensi dalam format kantong properti. Penting untuk mempertahankan ketiga fungsi ini untuk memastikan bahwa kontrol mengelola propertinya secara konsisten, terlepas dari mekanisme persistensi mana yang digunakan kontainer.

Lihat juga

Kontrol ActiveX MFC: Pengoptimalan