简单的操作浪费时间?

BSc*_*ker 3 c++ benchmarking profiling gprof

我正在寻找一个简单的操作/例程,如果连续重复,可以"浪费"时间.

我正在研究如何将gprof配置文件应用程序,因此这个"浪费时间"需要在用户空间中浪费时间,并且不需要外部库.IE,调用sleep(20)将"浪费"20秒的时间,但gprof不会记录这次,因为它发生在另一个库中.

对于可以重复浪费时间的简单任务的任何建议?

Lig*_*ica 6

在不产生CPU的情况下"浪费"时间的最简单方法是一个紧凑的循环.

如果您不需要限制浪费的持续时间(例如,您通过在完成后简单地终止该过程来控制它),那么转到C样式*:

for (;;) {}
Run Code Online (Sandbox Code Playgroud)

(但请注意,该标准允许实现假设程序最终会终止,所以从技术上讲这个循环 - 至少在C++ 0x中 - 具有未定义的行为并且可以进行优化!**

否则,您可以手动计时:

time_t s = time(0);
while (time(0) - s < 20) {}
Run Code Online (Sandbox Code Playgroud)

或者,不是重复发出time系统调用(这将导致在内核中花费一些时间),如果在GNU兼容系统上,您可以使用signal.h "警报"来结束循环:

alarm(20);
while (true) {}
Run Code Online (Sandbox Code Playgroud)

"Handler Returns"的文档页面上甚至有一个非常相似的例子.

(当然,这些方法都会让你在一段时间内将100%的CPU送到你手中,让蓬松的独角兽从你的耳朵里掉出来.)


*为清晰起见,{}而不是;刻意使用.最终,没有理由在这样的上下文中编写分号; 这是一个可怕的习惯,当你在"真正的"代码中使用它时,它会成为一个维护陷阱.

**见[n3290: 1.10/2][n3290: 1.10/24].


mic*_*slm 6

Tomalak解决方案的另一个变体是设置警报,因此在忙碌等待循环中,您不需要继续发出系统调用,而只需检查信号是否已发送.

  • 如果你忙着等待一个循环等待警报被提升,那么忙等待应该计入忙碌等待的过程?它有利于在内核中花费更少的时间,因为它不会重复发出``time()``syscall. (2认同)