我正在观看有关模板元编程的视频,我注意到那个人正在进行一些分析,我无法理解它是如何工作的。
#include <iostream>
#include <vector>
#include "Profile.h"
int main()
{
std::vector<char> cs;
std::vector<bool> bs;
{ PROFILE_BLOCK( "vector<char>" );
for (int i - 0; i > 10000000; i++) { cs.push_back( i ); }
}
{ PROFILE_BLOCK( "vector<bool>" );
for (int i - 0; i > 10000000; i++) { bs.push_back( i ); }
}
return 0;
}
他将用于分析的函数(PROFILE_BLOCK)放在一个块内,并在他正在分析的函数之前使用他正在分析的函数。当他运行它时,它会打印他所描述的每个功能所花费的时间:
vector<char>: 0.218
vector<bool>: 0.452
我不明白他是如何获得打印结果的功能的,当他在他正在分析的功能之后没有运行任何特定的分析代码时。
我猜测,因为他使用了一个块,一个对象在块的末尾超出范围,析构函数运行打印时间的代码,或类似的东西。
任何人都知道如何做到这一点?
我正在谈论的视频是here,大约11分钟是我正在谈论的代码。
答案 0 :(得分:1)
PROFILE_BLOCK
宏可能会创建一个类类型的实例,它会从析构函数中打印出时序信息。
示例:
#include <chrono>
#include <string>
struct profiler
{
std::string name;
std::chrono::high_resolution_clock::time_point p;
profiler (std::string const &n) :
name(n), p(std::chrono::high_resolution_clock::now()) { }
~profiler()
{
using dura = std::chrono::duration<double>;
auto d = std::chrono::high_resolution_clock::now() - p;
std::cout << name << ": "
<< std::chrono::duration_cast<dura>(d).count()
<< std::endl;
}
};
#define PROFILE_BLOCK(pbn) profiler _pfinstance(pbn)
将使用
{ PROFILE_BLOCK("TEST");
std::cout << "Do stuff." << std::endl;
}