我有一个C ++函数,它根据节点值的变化被称为事件。此函数涉及for
循环,它首次读取大约5000个节点并对它们执行一些计算。在读取尝试期间,通过比较每个节点的订阅ID(每个节点唯一)来为每个节点分配节点ID。在下一个事件期间,将使用其值已更改的节点再次调用此函数。现在执行相同的过程,在for
循环中分配节点ID(使用订阅ID),再次读取这5000个存储节点。
问题是,是否有更好的方法在第一个事件运行中链接这些节点ID,以便下次发生此事件时,不需要检查其值更改的所有节点的节点ID?订阅ID在此处是唯一编号。目前这个函数是基于事件的,并且非常频繁地调用,因此每秒比较5000个节点会导致其CPU负载始终为。
代码:
void SubscriptionEvent::handleEvent(EventSource *source, EventArguments *args)
{
SubscriptionEventArgs* subsArgs = static_cast<SubscriptionEventArgs*>(args);
vector<string> m_devicesReset;
if (subsArgs->eventType == SubscriptionEventArgs::VALUECHANGE)
{
AgrClient *client = static_cast<AgrClient *>(source);
OpcUa_UInt32 i = 0;
bool valueChange = false;
if(m_firstEvent == true)
{
for (i = 0; i < subsArgs->dataNotifications->length(); i++)
{
if (OpcUa_IsGood((*subsArgs->dataNotifications)[i].Value.StatusCode))
{
UaNodeId nodeId;
UaStatus status = client->getNodeIdForSubscriptionId((*subsArgs->dataNotifications)[i].ClientHandle, nodeId); //improve
}
}
}
}
}
}
以下输入参数
(*subsArgs->dataNotifications)[i].ClientHandle
是我每次获得 nodeId 时提供的订阅ID。最后一行是要改进的代码,因为函数getNodeIdForSubscriptionId()
运行for循环以搜索所提供订阅ID的nodeId
。