Omnet++ OMNet+中的自触发速度较慢+;

Omnet++ OMNet+中的自触发速度较慢+;,omnet++,Omnet++,我正在创建自己的有线仿真模型,其中节点具有分层架构 应用层定期生成数据包,然后使用 scheduleAt(simTime() + 0.00000000625,AppModuleSelfTrigger); 然后,该数据包在下一个较低层模块中缓冲。然后,下层模块定期检查该缓冲区中的数据包。我通过调度这个层模块以及使用 scheduleAt(simTime() + 0.00000000625,LowerLayerModuleSelfTrigger); 类似地,每一个使用缓冲区的较低层,我都会同样地

我正在创建自己的有线仿真模型,其中节点具有分层架构

应用层定期生成数据包,然后使用

scheduleAt(simTime() + 0.00000000625,AppModuleSelfTrigger);
然后,该数据包在下一个较低层模块中缓冲。然后,下层模块定期检查该缓冲区中的数据包。我通过调度这个层模块以及使用

scheduleAt(simTime() + 0.00000000625,LowerLayerModuleSelfTrigger);
类似地,每一个使用缓冲区的较低层,我都会同样地触发它们,以周期性地触发自身,并检查是否有任何缓冲数据包要发送

这种方法效果很好。但是,当我进一步减少延迟(0.00000000 625)时,GUI数据包流会变慢(例如,在我看到一个数据包流事件后,我必须等待很长时间才能在OMNeT++GUI中看到下一个数据包流)。但是,当我增加这个延迟值,而使用更高的十进制值时,例如0.2,那么GUI数据包流事件似乎很快(我不必等待太多时间来查看GUI中的下一个数据包)

但是,将此延迟设置为更高的值(如0.2)会增加数据包延迟(测量为
simTime()-PacketCreationTime


因此,我怀疑我是否正确使用了整个自触发过程,或者我需要做一些重大改进。

每6.25e-9秒安排一次事件来轮询缓冲区中的更改似乎是构建模拟模型的次优方式。假设每台主机有七层,那么每台主机每秒将浪费超过十亿个事件,以确保缓冲区不被修改。尽管处理每个事件只需要几个CPU周期,但事情很快就会累积起来

我建议您编写仿真模型,以便它们能够利用这样一个事实,即它们知道缓冲区何时发生变化。在仿真模型中,不需要轮询


例如,假设我们要对一个层进行建模,该层处理一个数据包需要10毫秒,并且每5毫秒轮询一次其缓冲区状态。进一步假设一个帧在时间t=3毫秒到达一个空缓冲区。在那个时刻,我们可以立即计算出,当下一次轮询缓冲区时(在t=5毫秒),将注意到该帧并在10毫秒后发出(t=15毫秒)。因此,建模此过程所需的全部工作就是在t=15 ms时安排“帧发送”事件。我们从不需要轮询。

动画速度是否会影响显示下一个事件的延迟?您是否在“运行”或“快速”模式下进行测试?不,事件会像往常一样生成。快速模式不显示gui效果,因此我仅使用Run进行测试。我问这个问题,我只是想问这样的自调度是否更好,或者是否有其他方法可以在不使用
scheduleAt()
的情况下实现同样的目标。还有,有没有办法告诉模拟滴答声持续时间和滴答声频率?自我信息是安排未来行动的通用方法。它可用于模拟各种动作。但是,我认为在您的情况下,
senddayed()
可能就足够了,因为您可能只想稍后发送此数据包。据我所知,没有办法控制持续时间。只有一个选项可以控制模拟中时间表示的精度(整个模拟,而不仅仅是GUI)-查看ini文件的选项
simtime scale
。我同意
senddayed()
选项。我的意思是,我有一个简单的模块,里面有缓冲区。上层注入这个缓冲区。现在,我希望这个模块定期轮询这个缓冲区。如果不使用
scheduleAt()
self消息一次又一次地触发自身,我如何实现这一点?这正是我所搜索的。这也解释了为什么我的模型花了太多时间在GUI中查看下一个数据包传输。请建议如何创建生成流量的应用程序(不使用此类自我消息技术)