是否有一种可控制的方式来减慢我在线评委的C++程序?

Jam*_*mes 2 c++ c++11

我正在寻找一种可控制的方式(很容易设置延迟时间)来减缓我在线评委的C++解决方案.(主要用于UVa g++ 4.8.2 -lm -lcrypt -O2 -std=c++11 -pipe)

我试过以下代码:

{auto start=std::chrono::high_resolution_clock::now();
while (std::chrono::duration<double,std::milli>
    (std::chrono::high_resolution_clock::now()-start).count()<2000);
}
Run Code Online (Sandbox Code Playgroud)

但解决方案减慢了大约1.6秒,而不是预期的2秒,我不知道为什么.

我也试过std::this_thread::sleep_forusleep()FOM <unistd.h>,但这些几乎没有在线的法官影响运行.

因为std::this_thread::sleep_for,我试过:

std::this_thread::sleep_for(std::chrono::milliseconds(2600));
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我的老师经常在这些在线评委上分配问题,我们的家庭作业评分员会将我们的解决方案提交给在线评委,以检查他们是否可以获得AC(已接受).因此,我的解决方案将在排名系统中计算两次,我认为这对后来的用户来说是不公平的,特别是当我的解决方案排在排名榜首时.因此,我倾向于放慢我的解决方案,以减少对其他用户的影响,然后再将其提交到作业评分系统.

5go*_*der 5

如果你想在一段时间内暂停执行你的程序,那么std::this_thread::sleep_for就是要走的路.但请注意,它确实让你的线程睡眠.也就是说,它在睡眠时放弃CPU.如果基准测试环境是测量CPU时间而不是墙上时间,那么睡眠将不会"帮助".相反,你要做的就是让CPU做一些无用的工作.(联合国)幸运的是,编译器已经非常善于消除无用的工作,所以你必须要小心.

您可以使用该time (1)实用程序来测量程序消耗的CPU和墙壁时间.

该程序睡眠时间为两秒.

#include <chrono>
#include <thread>

int
main()
{
  std::this_thread::sleep_for(std::chrono::seconds {2});
}
Run Code Online (Sandbox Code Playgroud)
$ g++ -o wall -std=c++14 -Wall -Wextra -Werror -pedantic wall.cxx -pthread
$ time ./wall

real    0m2.003s
user    0m0.000s
sys     0m0.000s

正如您所看到的,经过的"实际"时间几乎就是两秒,但CPU时间(详细到用户模式和内核中使用的CPU时间)可以忽略不计.

该程序浪费了两秒钟的CPU时间.

#include <ctime>

int
main()
{
  const auto t0 = std::clock();
  while ((std::clock() - t0) / CLOCKS_PER_SEC < 2)
    continue;
}
Run Code Online (Sandbox Code Playgroud)
$ g++ -o cpu1 -std=c++14 -Wall -Wextra -Werror -pedantic cpu1.cxx
$ time ./cpu1

real    0m2.003s
user    0m0.530s
sys     0m1.470s

同样,总("实际")执行时间是两秒,但这一次,我们在用户模式下花费了大约半秒钟,在内核模式下花费了一秒半(由于多次调用clock).

您可以通过在用户模式下执行更多工作来改变它.例如,std::clock我们可以做一些愚蠢的循环,而不是立即再次调用.

#include <ctime>

int
main()
{
  const auto t0 = std::clock();
  while ((std::clock() - t0) / CLOCKS_PER_SEC < 2)
    {
      int dummy;
      volatile int * pdummy = &dummy;
      for (int i = 0; i < 1'000'000; ++i)
        *pdummy = i;
    }
}
Run Code Online (Sandbox Code Playgroud)
$ g++ -o cpu2 -std=c++14 -Wall -Wextra -Werror -pedantic cpu2.cxx
$ time ./cpu2

real    0m2.005s
user    0m2.003s
sys     0m0.000s

这一次,几乎所有的CPU周期都浪费在用户模式下.如果您的计算机需要太长时间进行一百万次迭代,您可能需要修改幻数.