gpt4 book ai didi

c++ - 有没有一种可控的方法可以让我的 C++ 程序在在线评委上变慢?

转载 作者:太空狗 更新时间:2023-10-29 23:44:15 25 4
gpt4 key购买 nike

我正在寻找一种可控的方式(易于设置延迟时间)来减慢我在在线评委上的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);
}

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

我也试过std::this_thread::sleep_forusleep()<unistd.h> , 但这些几乎没有影响在线评委的运行时间。

对于 std::this_thread::sleep_for ,我试过:

std::this_thread::sleep_for(std::chrono::milliseconds(2600));

我之所以要这样做,是因为我的老师经常给这些在线评委布置问题,而我们的作业评分员会将我们的解决方案提交给那些在线评委,以检查他们是否可以获得 AC (Accepted)。结果,我的解决方案将在排名系统中被计入两次,我认为这对后来的用户不公平,尤其是当我的解决方案排在排名榜首时。所以我更愿意放慢我的解决方案,以减少对其他用户的影响,然后再将其提交给作业评分系统。

最佳答案

如果你想在给定的时间内暂停执行你的程序,那么 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});
}
$ g++ -o wall -std=c++14 -Wall -Wextra -Werror -pedantic wall.cxx -pthread$ time ./wallreal    0m2.003suser    0m0.000ssys     0m0.000s

As you can see, the elapsed “real” time is almost exactly two seconds but the CPU time (detailed into CPU time used in user mode and by the kernel) is negligible.

This program wastes two seconds worth of CPU time.

#include <ctime>

int
main()
{
const auto t0 = std::clock();
while ((std::clock() - t0) / CLOCKS_PER_SEC < 2)
continue;
}
$ g++ -o cpu1 -std=c++14 -Wall -Wextra -Werror -pedantic cpu1.cxx$ time ./cpu1real    0m2.003suser    0m0.530ssys     0m1.470s

Again, the total (“real”) execution time is two seconds but this time, we've also spent about half a second in user-mode and one and a half second in kernel mode (due to the many calls to clock).

You can shift this by doing more work in user mode. For example, instead of immediately calling std::clock again, we can do some silly loop.

#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;
}
}
$ g++ -o cpu2 -std=c++14 -Wall -Wextra -Werror -pedantic cpu2.cxx$ time ./cpu2real    0m2.005suser    0m2.003ssys     0m0.000s

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

关于c++ - 有没有一种可控的方法可以让我的 C++ 程序在在线评委上变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33594190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com