时间花在哪里
Where is the time being spent?
我有一个包含记录元素的xml文件。我正在将记录元素内的数据转换为PCAP格式。 代码如下所示。在 do 循环中,我只花费了 6 毫秒,但是当我在循环的边界上花费时间时,它表明我花费了 43 毫秒。这种差异从何而来?另外,我是循环内的内存新手。这是可以接受的做法,还是我应该将内存归零并重用它?重用会带来任何性能提升吗?循环内的时间如下所示
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466589,结束时间:1030466589
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466590,结束时间:1030466590
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466591,结束时间:1030466591
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466591,结束时间:1030466591
2012-05-14 07:26:48 线程 ID(19404( 跟踪:开始时间:1030466592,结束时间:1030466592
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466593,结束时间:1030466593
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466593,结束时间:1030466593
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466594,结束时间:1030466594
2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466595,结束时间:1030466595
但是在 do 循环边界上的时间是2012-05-14 07:26:48 线程ID(19404( 跟踪:开始时间:1030466584,结束时间:1030466627
static struct tms st_cpu;
static struct tms et_cpu;
clock_t end_time;
clock_t start_time;
char szData[100] = {0};
clock_t st_total_time;
clock_t et_total_time;
static struct tms st_total_cpu;
static struct tms et_total_cpu;
st_total_time = times(&st_total_cpu);
do {
char *pBuffer = new char[m_nBufferLen];
memset(pBuffer,0,m_nBufferLen);
if(fgets(pBuffer,m_nBufferLen,fpcap) != NULL)
{
char *pRecord = NULL;
if((pRecord = strstr(pBuffer,"<rec ")) != NULL)
{
start_time = times(&st_cpu);
CXMLParser objXMLParser(pBuffer);
objXMLParser.ProcessRecord();
objPCAPGenerator.GeneratePCAPRecord(&objXMLParser);
end_time = times(&et_cpu);
sprintf(szData,"start Time:%ld,End Time:%ld",start_time,end_time);
CLog::PrintLog(DBG_TRACE,"%s",szData);
sprintf(szData,"Real Time: %ld,UserTime:%ld,SystemTime:%ld",
end_time-start_time,
(et_cpu.tms_utime + et_cpu.tms_cutime) - (st_cpu.tms_utime + st_cpu.tms_cutime),
(et_cpu.tms_stime + et_cpu.tms_cstime) -(st_cpu.tms_stime + st_cpu.tms_cstime)
);
CLog::PrintLog(DBG_TRACE,"%s",szData);
}
}
else
{
bEnd = true;
}
}while(bEnd != true);
et_total_time = times(&et_total_cpu);
sprintf(szData,"start Time:%ld,End Time:%ld",st_total_time,et_total_time);
CLog::PrintLog(DBG_TRACE,"%s",szData);
sprintf(szData,"Total Real Time: %ld,Total UserTime:%ld,Total SystemTime:%ld",
et_total_time-st_total_time,
(et_total_cpu.tms_utime + et_total_cpu.tms_cutime) - (st_total_cpu.tms_utime + st_total_cpu.tms_cutime),
(et_total_cpu.tms_stime + et_total_cpu.tms_cstime) -(st_total_cpu.tms_stime + st_total_cpu.tms_cstime)
);
CLog::PrintLog(DBG_TRACE,"%s",szData);
一般来说,分配内存是一项相对昂贵的操作,因此如果这是性能关键型代码,则绝对应该重用分配的内存块。
另外,请记住删除您正在分配的内存。我看不到它现在正在完成。
当然,您可以并且应该分析您的代码,但仅从一瞥中,我看到了两个基本问题:
-
您正在为每次迭代重新分配缓冲区。这是必要的还是可以使用相同的缓冲区?顺便说一句,您无需在读取之前将其内存为 0,只需在字符串读取后放置一个尾随零即可。
-
是否有必要在每次迭代中从文件中读取? 如果文件很大并且无法放入内存,这当然是必要的。 如果文件具有已知的相对较小的大小,只需将其读取到一个大缓冲区,然后解析它,它会快得多。
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 时间花在哪里
- 我在哪里可以读出按键延迟时间
- 我如何找出编译器在哪里花费时间?
- PST 文件中的日历邮件在哪里存储约会时间和日期