我试图找到我最近在stackoverflow上发布的程序的效率.
为了比较我的代码与其他答案的效率,我正在使用chrono对象.
这是检查运行时效率的正确方法吗?
如果没有,那么请用一个例子来建议一种方法.
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
#include <ctime>
using namespace std;
void remove_elements(vector<int>& vDestination, const vector<int>& vSource)
{
if(!vDestination.empty() && !vSource.empty())
{
for(auto i: vSource) {
vDestination.erase(std::remove(vDestination.begin(), vDestination.end(), i), vDestination.end());
}
}
}
int main() {
vector<int> v1={1,2,3};
vector<int> v2={4,5,6};
vector<int> v3={1,2,3,4,5,6,7,8,9};
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
remove_elements(v3,v1);
remove_elements(v3,v2);
std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();
std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() <<std::endl;
for(auto i:v3)
cout << i << endl;
return …Run Code Online (Sandbox Code Playgroud) 我有一些任意的时代,比如1988年7月13日.基本上我想测量相对于此的时间.我正在考虑编写一个自定义时钟类,以便我可以编写这样的代码:
using std::chrono;
time_point<My_Clock> tp;
std::cout << duration_cast<seconds>(tp.time_since_epoch()).count() << std::endl;
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果没有,最简洁的方法是什么?
测试其他东西我偶然发现了一些我还没有想到的东西.
我们来看看这个片段:
#include <iostream>
#include <chrono>
int main () {
int i = 0;
using namespace std::chrono_literals;
auto const end = std::chrono::system_clock::now() + 5s;
while (std::chrono::system_clock::now() < end) {
++i;
}
std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
我注意到计数在很大程度上取决于我执行它的机器.
我用gcc 7.3,8.2和clang 6.0编译了std=c++17 -O3.
在i7-4790(4.17.14-arch1-1-ARCH内核):〜3e8
但在Xeon E5-2630 v4(3.10.0-514.el7.x86_64)上:〜8e6
现在这是我想要理解的差异,所以我已经检查过了 perf stat -d
在i7上:
4999.419546 task-clock:u (msec) # 0.999 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 K/sec
120 page-faults:u # 0.024 K/sec
19,605,598,394 cycles:u # 3.922 GHz …Run Code Online (Sandbox Code Playgroud) 如果我有一个time_point任意时钟(比方说high_resolution_clock::time_point),有没有办法将其转换time_point为另一个任意时钟(比方说system_clock::time_point)?
我知道如果存在这种能力,就必须有限制,因为并非所有的时钟都是稳定的,但有没有任何功能可以帮助这些规范中的转换呢?
默认构造函数std::chrono::duration定义如下:
constexpr duration() = default;
(例如,请参阅cppreference.com或libstdc ++源代码.)
但是,cppreference.com也谈到了constexpr构造函数:
constexpr构造函数必须满足以下要求:
...
必须在构造函数初始化列表中或通过成员大括号或相等的初始化程序初始化每个基类和每个非静态成员.另外,所涉及的每个构造函数都必须是constexpr构造函数,并且每个大括号或者相等的初始化程序的每个子句都必须是一个常量表达式
如果我对默认构造函数感到困惑,cppreference.com似乎说默认的构造函数与= default隐式构造函数的定义不同.
然而,rep(大多数)持续时间的类型是裸整数类型.所以,不应该将显式= default默认构造函数duration等效于
constexpr duration() {}
当然会保留duration::rep 未初始化类型的整数成员变量?而且,事实上,是不是标准的行为duration,使得缺省构造的值是未初始化?(但我找不到明确说明这一点的参考文献.)
在那么如何才能= default为构造duration是constexpr,如果离开一个非静态成员变量初始化?我错过了什么?
假设我们有
#include <chrono>
#include <iostream>
#include <ctime>
namespace Ratios { typedef std::ratio<60*60*24,1> Days; }
typedef std::chrono::system_clock Clock;
typedef Clock::time_point TimePoint;
Run Code Online (Sandbox Code Playgroud)
我们main看起来像
int main(int argc, char *argv[])
{
// argc check left out for brevity
const Clock::rep d = static_cast<Clock::rep>(std::atoi(argv[1]));
// Right now
TimePoint now = Clock::now();
// Start with zero days
auto days = std::chrono::duration<Clock::rep, Ratios::Days>::zero();
// Now we'd like to add d to the days
days += d; // Error!
days.count() = d; // Error!
days = …Run Code Online (Sandbox Code Playgroud) 我正在研究一个我想利用的软件设计Boost.Units.我想使用的一些单元代表时间,但是,我倾向于使用C++ 11 std::chrono单元,因为它们是标准的.
我想知道是否有任何干净的集成Boost.Units,chrono或者我是否必须通过在类型之间复制标量值来编写我自己的转换器并失去类型安全性.
这个问题有什么最佳做法吗?
我想打印或提取年/月/日值.
我不想用time_t,因为2038年的问题,但我在网上找到的所有例子都使用它来转换time_point到tm.
有没有一种简单的方法可以从time_point转换为tm(最好没有boost)?
就像一个实现timesub从libc的将是我的最后一招: http://www.opensource.apple.com/source/Libc/Libc-262/stdtime/localtime.c
编辑:在阅读建议的链接并进行更多研究后,我得出以下结论.
值得注意的是,Boost.Date_Time可以是仅限标头的库.资料来源:http: //www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#header-only-libraries
我怎样才能(使用std :: chrono库)得到两个时间点之间的差异,以毫秒为单位?
我可以用这个来做到这一点:
std::chrono::time_point<std::chrono::system_clock> now = std::chrono::system_clock::now();
std::chrono::time_point<std::chrono::system_clock> foo = now + std::chrono::milliseconds(100);
std::chrono::duration<float> difference = foo - now;
const int milliseconds = difference.count() * 1000;
Run Code Online (Sandbox Code Playgroud)
我怎样才能在毫秒内得到这个时间,所以我可以将持续时间用作unsigned int,而不是float,然后乘以1000?
起初我认为它可以用于性能测量.但它说这std::chrono::high_resolution_clock可能是不稳定(is_steady可能false).据说std::chrono::high_resolution_clock甚至可能是别名std::chrono::system_clock通常不稳定.所以我无法用这种类型的时钟来测量时间间隔,因为在任何时刻都可以调整时钟并且我的测量结果是错误的.
同时我无法将时间点转换std::chrono::high_resolution_clock为日历时间,因为它没有to_time_t方法.所以我也无法用这种类型的时钟获得实时.
那可以std::chrono::high_resolution_clock用什么呢?
c++ ×10
c++-chrono ×10
c++11 ×8
performance ×2
time ×2
algorithm ×1
boost ×1
boost-units ×1
clock ×1
year2038 ×1