代码运行缓慢

Slow running code

本文关键字:缓慢 运行 代码      更新时间:2023-10-16

我的项目中有以下功能:

void UDPBasicApp::incrementReceiveCounter(L3Address dest) {
char numberOfDestNode[10];
char name[50];
strcpy(name,L3AddressResolver().findHostWithAddress(dest)->getFullPath().c_str());
char temp[20];
char *last = strrchr(name, '.');
char *realLast = last + 1;
std::cout << "Destination is: " << realLast<<", IP is: "<<L3AddressResolver().resolve(realLast);//=====
strcpy(temp,realLast);
strtok(temp,"[");
strcpy(numberOfDestNode, strtok(NULL, "]"));
int realDestNumber = std::stoi(numberOfDestNode);
recArray[realDestNumber]++;
std::cout<<", Number of destination is: "<<realDestNumber<<std::endl;//=================
}

代码运行得非常好,速度很快,但是当调用此函数时,执行速度会非常慢。 此代码是 Omnet++ 中模拟项目的一部分,每次节点向另一个节点发送消息时都会调用此函数。所以考虑如果有 1000 个节点,这个函数将被调用 1000 次。 我可能在这里做了一些不必要的事情。

代码可能会稍微优化:

  • L3Address类具有方便的方法operator<<,因此不需要使用L3AddressResolver().resolve(realLast)(INET API)。
  • 应该避免使用cout进行日志记录(OMNeT++ 手册)。 应该使用EV而不是cout
  • 要在模块向量中获取模块的索引,可以使用cModule类中的getIndex()方法。

呈现的代码可以重写为以下代码:

void UDPBasicApp::incrementReceiveCounter(const L3Address& dest) {       
cModule *destHost = L3AddressResolver().findHostWithAddress(dest);
if (destHost) {
int realDestNumber = destHost->getIndex();
recArray[realDestNumber]++;
EV << "Destination is: " << destHost->getName() <<", IP is: "
<< dest << ", Number of destination is: "
<< realDestNumber << std::endl;
}
}

要提高模拟速度,您应该考虑:

  1. 在发布模式下构建模拟。
  2. 在 Cmdenv 模式下运行模拟。

如果要向同一目标发送 1000 封邮件,则正在执行 999 次不必要的名称查找。其中每个都可能需要往返到网络上的 DNS 服务器。这是非常低效的。

您应该解析一次名称,第一次需要联系特定目的地。缓存它以备下次使用。一个好的解析器会告诉你缓存它多长时间是安全的。更好的解析器将使用操作系统为您进行解析(和缓存),但即使您拥有其中之一,您仍然会对操作系统进行不必要的调用。

如果没有 MCVE,或者至少对L3AddressResolver确切的作用有一些了解,就不可能提供更多细节。

但是,如果每次目的地都不同,那么您真的无能为力。您需要留出时间进行查找。您能做的最好的事情就是异步执行它,以便可以同时进行多个查找。

根据应用程序的结构和要求,以及如果您事先知道它们是什么,您可能需要考虑提前查找所有名称。然后你仍然花费相同的时间,但在不同的地方(并且可能在其他功能发生时异步);那么这个特定的功能将非常快。只有你能说这是否有帮助。