我正在寻找一种可控制的方式(很容易设置延迟时间)来减缓我在线评委的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_for和usleep()FOM <unistd.h>,但这些几乎没有在线的法官影响运行.
因为std::this_thread::sleep_for,我试过:
std::this_thread::sleep_for(std::chrono::milliseconds(2600));
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是我的老师经常在这些在线评委上分配问题,我们的家庭作业评分员会将我们的解决方案提交给在线评委,以检查他们是否可以获得AC(已接受).因此,我的解决方案将在排名系统中计算两次,我认为这对后来的用户来说是不公平的,特别是当我的解决方案排在排名榜首时.因此,我倾向于放慢我的解决方案,以减少对其他用户的影响,然后再将其提交到作业评分系统.
如果你想在一段时间内暂停执行你的程序,那么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周期都浪费在用户模式下.如果您的计算机需要太长时间进行一百万次迭代,您可能需要修改幻数.
| 归档时间: |
|
| 查看次数: |
884 次 |
| 最近记录: |