在C ++ for循环

时间:2018-01-15 13:26:13

标签: c++ stl stdvector

我有一个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

0 个答案:

没有答案