질문
After upgrading from SDK 13 to SDK 14, the retrieval operation became slower
We implemented the retrieval function through the ITextwalker interface. After upgrading from SDK 13 to SDK 14, the performance of the retrieval operation deteriorated. However, it was not all the data, but only some data performed worse. The data that took more than 200 milliseconds in SDK 13 took more than 700 milliseconds in SDK 114.
The following is our code implementation. Can anyone give me some advises? Thank you。
/** SearchText
Search text in a story ITextWalker
* @9397041 textStart [in] the start position of the text search range
* @9397041 textLength [in] the length of the text search range
* @9397041 searchText [in] text to be searched
* @9397041 foundStartPos [out] the start position of the found text
* @retval kSuccess success
* @retval kFailure failure
* @10397173
*/
ErrorCode TextModelHelper::SearchText(int32 textStart, int32 textLength, const WideString& searchText, int32& foundStartPos)
{
ErrorCode status = kFailure;
do
{
if (!m_StoryUIDRef || searchText.CharCount()<=0) break;
ISession* currSess = GetExecutionContextSession();
InterfacePtr<IK2ServiceRegistry> serviceRegistry(currSess, UseDefaultIID());
if (!serviceRegistry) break;
InterfacePtr<IK2ServiceProvider> serviceProvider(serviceRegistry->QueryServiceProviderByClassID(kTextWalkerService, kTextWalkerServiceProviderBoss));
if (!serviceProvider) break;
InterfacePtr<IWorkspace> sessionWorkSpace(currSess->QueryWorkspace());
if (!sessionWorkSpace) break;
#if(defined ID_CS5 || defined ID_CS5_5 || defined ID_CS6 || defined ID_CC || defined ID_CC2014 || defined ID_CC2015 || defined ID_CC2017 || defined ID_CC2018 || defined ID_CC2019 || defined ID_CC2020 || defined ID_CC2021 || defined ID_CC2022 || defined ID_CC2023)
InterfacePtr<IFindChangeOptions>
findChangeOptions(static_cast<IFindChangeOptions*>
(::CreateObject(kSpellCheckFindChangeDataBoss, IID_IFINDCHANGEOPTIONS)));
#else
InterfacePtr<IFindChangeOptions> findChangeOptions((IFindChangeOptions*)sessionWorkSpace->QueryInterface(IID_IFINDCHANGEOPTIONS));
#endif
if (!findChangeOptions)
break;
findChangeOptions->SetFindString(searchText, IFindChangeOptions::kTextSearch);
InterfacePtr<ITextWalker> textWalker(serviceProvider, UseDefaultIID());
if (!textWalker) break;
if (!textWalker->IsWalking())
{
InterfacePtr<ITextModel> textModel(m_StoryUIDRef, UseDefaultIID());
if (!textModel) break;
InterfacePtr<ITextWalkerScope> textWalkerScope(Utils<IWalkerScopeFactoryUtils>()->QueryRangeWalkerScope(textModel, textStart, textLength));
if (!textWalkerScope) break;
InterfacePtr<ITextWalkerClient> textWalkerClient(static_cast<ITextWalkerClient*>(::CreateObject2<ITextWalkerClient>(kFindChangeClientBoss)));
if (!textWalkerClient) break;
textWalker->Initialize(textWalkerClient, textWalkerScope, findChangeOptions, nil);
}
CAlert::SetShowAlerts(kFalse);
InterfacePtr<ICommand> findCmd(CmdUtils::CreateCommand(kFindTextCmdBoss));
InterfacePtr<IFindChangeCmdData> findChangeCmdData(findCmd, UseDefaultIID());
if (!findChangeCmdData) break;
findChangeCmdData->SetTextWalker(textWalker);
findChangeCmdData->SetRange(m_StoryUIDRef, textStart, textStart+textLength);
status = CmdUtils::ProcessCommand(findCmd);
if (status != kSuccess) break;
CAlert::SetShowAlerts(kTrue);
// Get the found position
int32 foundEndPos = 0;
findChangeCmdData->GetRange(foundStartPos, foundEndPos);
textWalker->Halt();
status = (findChangeCmdData->GetFindChangeResult() != IFindChangeService::kFailure && foundStartPos >= textStart && foundStartPos <= (textStart + textLength)) ? kSuccess : kFailure;
}
while(kFalse);
return status;
}
