增强定时器-如何设置级别的细节,我想要微秒
Boost timer - how to set level of detail, I want microseconds?
所以我尝试用boost 1.47.0创建简单的速度bench。但是像1.423这样的结果对我来说不够详细。我需要更详细的资料。如何得到它?如何使boost::timer显示微秒?
长椅上代码:
#include <iostream>
#include <boost/thread.hpp>
#include <map>
#include <boost/thread.hpp>
#include <boost/thread/locks.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <boost/random.hpp>
#include <boost/timer.hpp>
#include <boost/progress.hpp>
class TestDs
{
public:
virtual bool containsKey(int key)=0;
virtual int get(int key)=0;
virtual int put(int key, int value)=0;
virtual int remove(int key)=0;
virtual int size()=0;
virtual const char* name()=0;
virtual void print()=0;
virtual void shutdown()=0;
};
class GeneralMap: public TestDs
{
private:
std::map<int,int> _ds;
mutable boost::mutex mut_;
public:
GeneralMap() {}
bool containsKey(int key) {
boost::mutex::scoped_lock lock(mut_);
if ( _ds.find(key) != _ds.end())
{
return true;
}
else
{
return false;
}
}
int get(int key) {
boost::mutex::scoped_lock lock(mut_);
return _ds[key];
}
int put(int key, int value) {
boost::mutex::scoped_lock lock(mut_);
_ds.insert(std::pair<int, int>(key,value));
return key;
}
int remove(int key) {
boost::mutex::scoped_lock lock(mut_);
return _ds.erase(key);
}
int size() {
boost::mutex::scoped_lock lock(mut_);
return _ds.size();
}
const char* name() {
return "StdMap";
}
void print() {}
void shutdown() {}
};
int n;
boost::shared_mutex tests;
boost::shared_mutex results;
boost::random::mt19937 rng;
boost::timer timerForCaptureFame;
GeneralMap Ds;
boost::progress_display *show_progress;
void test( int i)
{
boost::shared_lock<boost::shared_mutex> lock_r(results);
boost::shared_lock<boost::shared_mutex> lock(tests);
Ds.put(i, 0);
if (Ds.containsKey(i))
{
Ds.get(i);
}
Ds.remove(i);
++(*show_progress);
}
void result()
{
boost::upgrade_lock<boost::shared_mutex> lock(results);
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
std::cout << std::endl << "test of " << Ds.name() << " complite;" << std::endl << "test performed on " << n << " items" << std::endl << "test duration: " << timerForCaptureFame.elapsed() << std::endl;
}
void create_tests( int n)
{
boost::upgrade_lock<boost::shared_mutex> lock(tests);
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
boost::shared_lock<boost::shared_mutex> lock_r(results);
for(int i=0; i<n; i++)
{
boost::random::uniform_int_distribution<> ran = boost::random::uniform_int_distribution<>(1, n*10);
int x = ran(rng);
boost::thread worker(test, x);
}
boost::thread worker_r(result);
timerForCaptureFame.restart();
return;
}
int main()
{
n = 1000;
show_progress = new boost::progress_display(n);
create_tests(n);
std::cin.get();
return 0;
}
Boost的计时器库依赖于C标准库clock()函数和CLOCKS_PER_SEC。你能得到的最大分辨率取决于它,所以我会先调查一下,看看你的系统是否支持微秒分辨率。如何使boost::timer显示微秒?
MSVC设置为CLOCKS_PER_SEC == 1000,所以如果你正在编译的话,你将无法获得微秒分辨率。其他系统确实支持CLOCKS_PER_SECOND == 1000000,因此您应该考虑设置固定的输出格式并为双精度设置精度:
std::cout << std::fixed << std::precision(6) << timerForCaptureFame.elapsed();
看看这个来自Boost邮件页面的帖子是否有帮助。
你可以看看这个Stackoverflow问题
相关文章:
- 如何设置一个范围来提取我想要获得的信息
- 链接列表运算符重载没有打印出我想要的内容
- 莱克斯没有返回我想要的东西
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 我想要一个改变数组快速排序的2个数字的函数
- 输出不是我想要C++的
- 使用运算符覆盖排序没有得到我想要的
- C ++,否则文本程序不会进入我想要的途径
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 我如何使用 juce 的文件过滤器描述我想要的文件过滤器?
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 代码不会发送我想要的权衡
- 无法在openGL和GLUT中为我想要的确切对象设置动画
- 我如何强迫Visual Studio使用我想要的依赖性库名称
- 我的 OpenGL QQuickItem 没有我想要的大小
- 我可以/应该在 #ifndef 后输入任何我想要的东西
- C++ microshell,输入一个命令并使用fork(),dup(),pipe()将其通过管道传输到进程。只是我没有得到我想要的结果
- 增强定时器-如何设置级别的细节,我想要微秒