求问rdtsc测时

[复制链接]
查看11 | 回复8 | 2021-1-29 05:13:14 | 显示全部楼层 |阅读模式
用rdtsc测量C++中dynamic_cast的耗时,源码如下。奇怪的是,循环的第一次耗时总是特别大,大约是几k个时钟周期。而到了后面就会下降到200个时钟周期左右。请问这是为什么?

#include iostream
using namespace std;
#define N 10000
__int64 rdtsc()
{
__asm rdtsc;
}
class employee {
public:
virtual int salary(){return 0;}
};
class manager : public employee {
public:
int salary();
};
class programmer : public employee {
public:
int salary();
int bonus();
};
int main()
{
__int64 start;
__int64 end;
__int64 sum = 0;
__int64 record[N];
employee *pe = new employee;
for (int i = 0;iN;i++)
{
start = rdtsc();
programmer *pm = dynamic_cast programmer* ( pe );
end = rdtsc();
delete pm;
record = end - start;
sum += record;
}
for (int i = 0;iN;i++)
coutrecordendl;
coutsumendl;
return 0;
}



回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
我测了一下,确实是这样。改动了一些地方,deletepm那有点小问题,newemployee是在外面,但却delete多次,但在第一次delete后就没有内容了,之后相当于deleteNULL;我开始觉得是后来都没有dynamic_cast,但发现即使在循环内newemployee,结果也是这样@@
猜想可能是编译器优化,可以g++-O0试试……现在手头没这环境starisme (CS09|Mage) 在 ta 的帖子中提到:用rdtsc测量C++中dynamic_cast的耗时,源码如下。奇怪的是,循环的第一次耗时总是特别大,大约是几k个时钟周期。而到了后面就会下降到200个时钟周期左右。请问这是为什么?code#includeiostreamusingnamespacestd;#defineN10000__int64rdtsc(){...........................

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层

windows下的话就用QueryPerformanceCounter和QueryPerformanceFrequency。starisme (CS09|Mage) 在 ta 的帖子中提到:用rdtsc测量C++中dynamic_cast的耗时,源码如下。奇怪的是,循环的第一次耗时总是特别大,大约是几k个时钟周期。而到了后面就会下降到200个时钟周期左右。请问这是为什么?code#includeiostreamusingnamespacestd;#defineN10000__int64rdtsc(){...........................

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
delete那个是我sb了。。
badbear (大坏熊^_^) 在 ta 的帖子中提到:我测了一下,确实是这样。改动了一些地方,deletepm那有点小问题,newemployee是在外面,但却delete多次,但在第一次delete后就没有内容了,之后相当于deleteNULL;我开始觉得是后来都没有dynamic_cast,但发现即使在循环内newemployee,结果也是这样@@猜想可能是编译器优化,可以g++-O0试试……现在手头没这环境

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
但问题的point其实不在这……
建议你查看一下这点的汇编代码……我上午时大概跟了一下,不过在RTTI那里汇编部分有个调用,有点小长,没仔细研究……starisme (CS09|Mage) 在 ta 的帖子中提到:delete那个是我sb了。。

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
第一次如果和后面一样的速度才不正常了
第一次要真正从内存读(dynamic_cast的实现在一个函数里,以及它的实现还要访问虚表等,第一次调用时可能还会触发多次缺页异常),后面就全在cache里
starisme (CS09|Mage) 在 ta 的帖子中提到:用rdtsc测量C++中dynamic_cast的耗时,源码如下。奇怪的是,循环的第一次耗时总是特别大,大约是几k个时钟周期。而到了后面就会下降到200个时钟周期左右。请问这是为什么?code#includeiostreamusingnamespacestd;#defineN10000__int64rdtsc(){...........................

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
嗯,我前面说错了,删去
vonNeumann (冯·诺伊曼|Farewell,PKU) 在 ta 的帖子中提到:第一次如果和后面一样的速度才不正常了第一次要真正从内存读(dynamic_cast的实现在一个函数里,以及它的实现还要访问虚表等,第一次调用时可能还会触发多次缺页异常),后面就全在cache里

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
oops,学习了,忘了cache@@vonNeumann (冯·诺伊曼|Farewell,PKU) 在 ta 的帖子中提到:第一次如果和后面一样的速度才不正常了第一次要真正从内存读(dynamic_cast的实现在一个函数里,以及它的实现还要访问虚表等,第一次调用时可能还会触发多次缺页异常),后面就全在cache里

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
应该是这个,等我测试一下vonNeumann (冯·诺伊曼|Farewell,PKU) 在 ta 的帖子中提到:第一次如果和后面一样的速度才不正常了第一次要真正从内存读(dynamic_cast的实现在一个函数里,以及它的实现还要访问虚表等,第一次调用时可能还会触发多次缺页异常),后面就全在cache里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行