首页 > 代码库 > ns3 常用优化技术

ns3 常用优化技术

ns3中大部分程序使用C++,对C++的很多部分都进行了优化,比如日志系统/智能指针等. 于是就想起写这篇文章来总结一下.

1. Logging系统

C++中一般使用std::cout来打印消息,当打印语句增多时,这个就不太实用了,于是出现了Logging系统,其实是对打印的消息进行了分类,从而更好的控制打印的消息.log的级别在程序中是这样设定的:

enum LogLevel {
  LOG_NONE           = 0x00000000, //!< no logging

  LOG_ERROR          = 0x00000001, //!< serious error messages only  <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录错误信息</span>
  LOG_LEVEL_ERROR    = 0x00000001,

  LOG_WARN           = 0x00000002, //!< warning messages  <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录警告信息</span>
  LOG_LEVEL_WARN     = 0x00000003,

  LOG_DEBUG          = 0x00000004, //!< rare ad-hoc debug messages  <span style="font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录相对不常见的调试信息</span>
  LOG_LEVEL_DEBUG    = 0x00000007,

  LOG_INFO           = 0x00000008, //!< informational messages (e.g., banners)   <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录程序进展信息</span>
  LOG_LEVEL_INFO     = 0x0000000f,

  LOG_FUNCTION       = 0x00000010, //!< function tracing  <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录描述每个调用函数信息</span>
  LOG_LEVEL_FUNCTION = 0x0000001f, 

  LOG_LOGIC          = 0x00000020, //!< control flow tracing within functions  <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录一个函数内描述逻辑流程的信息</span>
  LOG_LEVEL_LOGIC    = 0x0000003f,

  LOG_ALL            = 0x0fffffff, //!< print everything   <span style="color: rgb(85, 85, 85); font-family: 宋体;font-size:14px; line-height: 32px; text-indent: 28px;">记录所有信息</span>
  LOG_LEVEL_ALL      = LOG_ALL,

  LOG_PREFIX_FUNC    = 0x80000000, //!< prefix all trace prints with function
  LOG_PREFIX_TIME    = 0x40000000, //!< prefix all trace prints with simulation time
  LOG_PREFIX_NODE    = 0x20000000, //!< prefix all trace prints with simulation node
  LOG_PREFIX_LEVEL   = 0x10000000, //!< prefix all trace prints with log level (severity)
  LOG_PREFIX_ALL     = 0xf0000000  //!< all prefixes
};
上面可以大概看出7个级别(中文注释的几个),级别从低到高,高级别的会输出低级别的信息.级别根据你的需求来选择.

怎么使用?

(1)引入头文件:#include "ns3/core-module.h",这个头文件里包含了#include "log.h"

(2)自定义组件,NS_LOG_COMPONENT_DEFINE("MyTest");

(3)激活定义的组件,可以用程序也可以环境变量的方法,个人喜欢使用环境变量的方法,更加灵活不用修改程序:

a. 程序的方法:  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

b.环境变量的方法:export NS_LOG=UdpEchoClientApplication=level_all

(4)使用Logging系统提供的宏定义来输出, 比如NS_LOG,我们看看在开启Logging系统时,NS_LOG的定义:

#define NS_LOG(level, msg)                                        do                                                                {                                                                 if (g_log.IsEnabled (level))                                      {                                                                 NS_LOG_APPEND_TIME_PREFIX;                                      NS_LOG_APPEND_NODE_PREFIX;                                      NS_LOG_APPEND_CONTEXT;                                          NS_LOG_APPEND_FUNC_PREFIX;                                      NS_LOG_APPEND_LEVEL_PREFIX (level);                             std::clog << msg << std::endl;                                }                                                           }                                                             while (false)
终于可以见到调用clog来进行输出的语句了.

(5)使用eclipse怎么设定环境变量,参见帖子:添加环境变量
变量:NS_LOG, 值:MyTest=level_all|prefix_func|prefix_time, 其中prefix_time可以打印出仿真的时间,这个非常有用


2. 定时器任务

开启仿真,自然要指定在何时执行什么代码.  

(1) 引入头文件:#include "ns3/simulator.h"

(2)使用:

TrafficLightGenerator * test1 =new TrafficLightGenerator();
Simulator::Schedule(Seconds(3), &TrafficLightGenerator::Step,test1);
在3s的时候去执行对于类的状态转移函数