Re[4]: Проблема с маршалингом массива BSTR в VB
От:
Аноним
Дата: 27.07.06 23:03
Оценка:
Мне стало интересно и я отпрофайлил об варианта. Второй — в 10 раз быстрее — примерно так я и ожидал. Профайлил в Debug, роли играть не должно — только вызовы API, по сути, оптимизация мало чего изменит.
HRESULT ThatFn(VARIANT* Result)
1 0.0 0.2 {
SAFEARRAYBOUND rgsabound[1];
1 0.0 0.2 rgsabound[0].lLbound=0;
1 0.0 0.2 rgsabound[0].cElements =2;
BSTR HUGEP *pBSTR;
VARIANT tmp;
1 0.1 0.6 VariantInit(&tmp);
1 0.1 0.7 VariantClear(Result);
1 0.9 10.7 VariantChangeType(&tmp,&tmp,VARIANT_NOVALUEPROP,VT_ARRAY);
1 0.0 0.6 VariantChangeType(Result,Result,VARIANT_NOVALUEPROP,VT_ARRAY);
1 5.3 64.4 tmp.parray=SafeArrayCreate(VT_BSTR,1,rgsabound);
1 0.3 3.7 Result->parray=SafeArrayCreate(VT_BSTR,1,rgsabound);
1 0.1 0.6 HRESULT hr = SafeArrayAccessData(tmp.parray, (void HUGEP* FAR*)&pBSTR);
1 0.6 7.1 pBSTR[0]=SysAllocString(L"Hello!");
1 0.2 2.5 pBSTR[1]=SysAllocString(L"World!");
1 0.1 0.6 SafeArrayUnaccessData(tmp.parray );;
1 0.1 0.7 VariantCopy(Result,&tmp);
1 0.0 0.6 VariantClear(&tmp);
1 0.0 0.3 return S_OK;
}
HRESULT ThisFn(VARIANT* Result)
1 0.0 0.3 {
1 0.2 2.7 Result->parray = SafeArrayCreateVector(VT_BSTR, 0, 2);
1 0.0 0.2 if(Result->parray)
{
1 0.0 0.2 BSTR* pBSTR = reinterpret_cast<BSTR*>(Result->parray->pvData);
1 0.2 2.4 pBSTR[0]=SysAllocString(L"Hello!");
1 0.2 2.3 pBSTR[1]=SysAllocString(L"World!");
1 0.0 0.2 Result->vt = VT_ARRAY|VT_BSTR;
1 0.0 0.2 return S_OK;
}
else
{
Result->vt = VT_EMPTY;
return E_OUTOFMEMORY;
}
}
int _tmain(int argc, _TCHAR* argv[])
1 0.4 5.1 {
VARIANT Result;
1 0.4 4.9 VariantInit(&Result);
1 7.7 94.7 ThatFn(&Result);
1 0.0 0.6 VariantClear(&Result);
1 0.7 9.1 ThisFn(&Result);
1 0.4 5.0 VariantClear(&Result);
1 0.2 2.7 return 0;
}
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить