首页 > 代码库 > 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的时候去执行对于类的状态转移函数