只是测试这两个小程序,
#include <thread>
int main()
{
for (int i = 0; i < 10000000; i++)
{
std::this_thread::yield();
}
return 0;
}
并且:
#include <thread>
#include <chrono>
int main()
{
using namespace std::literals;
for (int i = 0; i < 10000000; i++)
{
std::this_thread::sleep_for(0s);
}
return 0;
}
我在我的系统上(Ubuntu 22.04 LTS,内核版本5.19.0-43-generic)获取了相应的时间。
./a.out 0,33s user 1,36s system 99% cpu 1,687 total
并且:
./a.out 0,14s user 0,00s system 99% cpu 0,148 total
为什么
std::this_thread::yield()
的速度比 std::this_thread::sleep_for(0s)
慢10倍?注:在g++和clang++之间的计时相似。
编辑:正如答案中指出的,这是STL实现的优化,调用
sleep(0)
实际上要慢300倍(50微秒对比150纳秒)。
sleep_for(x);
通常只会进行一次if (x > 0)
的检查,如果x为零,则不执行任何操作。与我理解的yield()不同,yield()实际上会暂停线程并将控制权交还给操作系统。 - freakishsleep_for(x);
通常只会进行一次if (x>0)
的检查,如果x为零,则不会执行任何操作。与我理解的yield()不同,yield()实际上会暂停线程并将控制权交还给操作系统。 - freakishsleep_for(x);
通常只会进行一次if (x>0)
的检查,如果x为零,则不会执行任何操作。与我理解的yield()不同,yield()实际上会暂停线程并将控制权交还给操作系统。 - undefined