- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
众所周知,clock()
可能显示小于或大于实时值-在下面的示例1和2中都显示了这两种情况。
对于C++ 11中时间的高精度测量,我们可以使用:
std::chrono::high_resolution_clock::now();
-保证高精度std::chrono::steady_clock::now();
-保证实时测量clock();
-保证高精度,但测量CPU周期而不是时间time(&t_start);
-精度不高,但可以实时测量#include <stdio.h>
#include <time.h>
#include <thread>
#include <iostream>
#include <chrono>
int main(void) {
std::cout << "sleep(3) took: \n\n";
clock_t c_start, c_end;
time_t t_start, t_end;
std::chrono::high_resolution_clock::time_point h_start, h_end;
std::chrono::steady_clock::time_point steady_start, steady_end;
time(&t_start); // less precise than clock() but always get the real actual time
c_start = clock(); // clock() get only CPU-time, it can be more than real or less - sleep(3); took 0.00 seconds
h_start = std::chrono::high_resolution_clock::now();
steady_start = std::chrono::steady_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(3));
steady_end = std::chrono::steady_clock::now();
h_end = std::chrono::high_resolution_clock::now();
c_end = clock();
time(&t_end);
std::cout << "highres = " << std::chrono::duration<double>(h_end - h_start).count() << " s \n";
std::cout << "steady = " << std::chrono::duration<double>(steady_end - steady_start).count() << " s \n";
printf("clock() = %.2lf seconds \n", (c_end - c_start) / (double)CLOCKS_PER_SEC);
printf("time() = %.2lf seconds \n", difftime(t_end, t_start));
return 0;
}
sleep(3) took:
highres = 3.00098 s
steady = 3.00098 s
clock() = 0.00 seconds
time() = 3.00 seconds
sleep(3) took:
highres = 3.00017 s
steady = 3.00017 s
clock() = 3.00 seconds
time() = 3.00 seconds
<thread>
:
http://coliru.stacked-crooked.com/a/2922c85385d197e1
#include <stdio.h>
#include <time.h>
#include <thread>
#include <iostream>
#include <chrono>
#include <vector>
int main(void) {
std::cout << "for-loop took: \n\n";
clock_t c_start, c_end;
time_t t_start, t_end;
std::chrono::high_resolution_clock::time_point h_start, h_end;
std::chrono::steady_clock::time_point steady_start, steady_end;
time(&t_start); // less precise than clock() but always get the real actual time
c_start = clock(); // clock() get only CPU-time, it can be more than real or less - sleep(3); took 0.00 seconds
h_start = std::chrono::high_resolution_clock::now();
steady_start = std::chrono::steady_clock::now();
#pragma omp parallel num_threads(10)
{
for (volatile int i = 0; i < 200000000; ++i);
}
steady_end = std::chrono::steady_clock::now();
h_end = std::chrono::high_resolution_clock::now();
c_end = clock();
time(&t_end);
std::cout << "highres = " << std::chrono::duration<double>(h_end - h_start).count() << " s \n";
std::cout << "steady = " << std::chrono::duration<double>(steady_end - steady_start).count() << " s \n";
printf("clock() = %.2lf seconds \n", (c_end - c_start) / (double)CLOCKS_PER_SEC);
printf("time() = %.2lf seconds \n", difftime(t_end, t_start));
int b = getchar();
return 0;
}
for-loop took:
highres = 0.213906 s
steady = 0.213905 s
clock() = 1.35 seconds
time() = 0.00 seconds
for-loop took:
highres = 1.49109 s
steady = 1.49109 s
clock() = 1.49 seconds
time() = 2.00 seconds
clock()
不会像其他函数那样测量时间。 <thread>
(link)使用多线程时,则g++ 4.9.2上的clock()
会测量所有线程的CPU周期。 clock()
都需要实时测量,但这不能保证
clock()
在其他平台上也可以实现相同的测量(在Linux上,对于 sleep ,g++为0,对于多线程,x-fold)。
std::chrono::high_resolution_clock::now();
在Windows MSVS 2013和g++ 4.9.2上都同时测量了两种情况下所需的实时性,是否保证了它将在所有其他平台上测量实际的高分辨率时间,并且是否保证了标准的C++ 11/14吗
最佳答案
简短的答案:从C++ 14标准开始,high_resolution_clock
不会明确提供您要寻找的保证。
目前,steady_clock
和system_clock
提供了更好,更明确的保证。但是,大多数实现可能会确保HRC在其线程处于休眠状态时继续前进。尽管如此,最好还是自己进行类型别名。请参阅下面的“编辑”部分以及评论中的讨论。
长答案:
draft standard实际上确实隐式地承认(在注释30.2.4“定时规范”,注释5中),时钟对象是,而不是在关联线程处于休眠状态时需要前进的。就上下文而言,本节说明标准库计时器对象如何工作。计时器的行为基于用于对其进行设置的时钟的行为。
[ Note: If the clock is not synchronized with a steady clock, e.g., a CPU time clock, these timeouts might not provide useful functionality. — end note ]
sleep_until
编码,则您的线程将不会唤醒。因此,上面的说明有些轻描淡写。
high_resolution_clock
的两个可能的别名:
high_resolution_clock
may be a synonym forsystem_clock
orsteady_clock
.
steady_clock
当然是稳定的。
system_clock
是
而不是,因为在程序运行时系统时间可能会更改(例如,由于NTP更新)。
system_clock
(20.13.7.1)
是仍然是“实时”时钟:
Objects of class
system_clock
represent wall clock time from the system-wide realtime clock.
system_clock
不会继续停止前进。
is_steady
的
high_resolution_clock
可能为false(即,不管其相关线程的状态如何,它都会前进)。
high_resolution_clock
使用某种实时(即同步)时钟似乎是合理的。毕竟,实现被设计为有用的,并且如果时钟不是实时的,则时钟通常没有那么有用,尤其是按照上面“有用功能”的注释,如果它与计时器一起使用,则尤其如此。
I would not be opposed to deprecating
high_resolution_clock
, with the intent to remove it after a suitable period of deprecation. The reality is that it is always a typedef to eithersteady_clock
orsystem_clock
, and the programmer is better off choosing one of those two and know what he’s getting, than choosehigh_resolution_clock
and get some other clock by a roll of the dice.
high_resolution_clock
。
high_resolution_clock
的问题不是那么多,您很可能会遇到HRC的问题(尽管根据上面的参数,即使使用兼容的编译器,这也是可能的),但是由于您通常实际上并没有获得比其他两个时钟之一更低的分辨率(尽管您需要在类型别名或typedef中手动比较它们的分辨率,以获得“最大分辨率”的非 sleep 时钟),没有具体的好处。因此,您需要权衡使线程在符合标准的实现中永久 sleep 的风险,名称
high_resolution_clock
的语义优势以及避免仅制作自己的typedef或类型别名的简单性/简洁性优势。
static_assert
来检查high_resolution_clock
是否实际上是真实时钟的别名。这可能永远不会触发,这意味着您将自动获得最高分辨率的“实时”时钟,而不会弄乱您自己的typedef: static_assert(
std::is_same<high_resolution_clock, steady_clock>::value
|| std::is_same<high_resolution_clock, system_clock>::value,
"high_resolution_clock IS NOT aliased to one of the other standard clocks!");
high_resolution_clock::is_steady
为true,则使用HRC;否则为false。否则,建议使用system_clock
和steady_clock
之间的高分辨率时钟。 注意,如果high_resolution_clock::is_steady
为false,则可能仅意味着HRC别名为system_clock
,在这种情况下,您最终将得到一个新的类型别名,该别名实际上与high_resolution_clock
相同。但是,创建自己的类型别名使这一点很明确,并保证即使是恶意但合规的实现也不会出现上述问题。using maxres_sys_or_steady =
std::conditional<
system_clock::period::den <= steady_clock::period::den,
system_clock, steady_clock
>::type;
using maxres_nonsleeping_clock =
std::conditional<
high_resolution_clock::is_steady,
high_resolution_clock, maxres_sys_or_steady
>::type;
关于c++ - 标准C++ 11是否保证high_resolution_clock测量实时(非CPU周期)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38252022/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!