sách gpt4 ai đã đi

Mất thời gian lớn trong vòng lặp for đơn giản

In lại 作者:行者123 更新时间:2023-12-03 06:50:25 28 4
mua khóa gpt4 Nike

我有一个非常简单的程序来测量一个函数花费了多少时间。

#include 
#include
#include
struct Foo
{
void addSample(uint64_t s)
{
}
};

void test(const std::vector& samples)
{
uint32_t onlyCallTime = 0;
uint32_t loopOnlyTime = 0;
Foo stats;
std::chrono::high_resolution_clock::time_point callStart,callEnd;
auto start = callStart = callEnd = std::chrono::high_resolution_clock::now();
for(auto &s : samples)
{
callStart = std::chrono::high_resolution_clock::now();
loopOnlyTime += std::chrono::duration_cast(callStart-callEnd).count();
stats.addSample(s);
callEnd = std::chrono::high_resolution_clock::now();
onlyCallTime += std::chrono::duration_cast(callEnd-callStart).count();
}
auto end = std::chrono::high_resolution_clock::now();

std::cout << "overall duration: " << std::chrono::duration_cast(end-start).count() << std::endl;
std::cout << "only call duration: " << onlyCallTime << std::endl;
std::cout << "only loop duration: " << loopOnlyTime << std::endl;
}

int chính()
{
std::vector dataSetDecreasing;
for(uint32_t i = 0; i < 1000000; ++i)
dataSetDecreasing.push_back(1000000-i);
test(dataSetDecreasing);
}
输出真的很困惑。这里有些例子:
overall duration: 56047
only call duration: 195
only loop duration: 285
overall duration: 40984
only call duration: 177
only loop duration: 243
overall duration: 47328
only call duration: 187
only loop duration: 177
我怎么看是 callEnd-callStart捕获对 addSample 的调用+ duration_cast . callStart-callEnd捕获其他所有内容,因此循环初始化、迭代、条件和第二个 duration_cast .我错过了什么?其他 ~40000 微秒去哪里了?
编译 g++ -Wall -Wextra -std=c++17 -O3 g++ (GCC) 10.2.1 20200723 (Red Hat 10.2.1-1)我的操作系统是 Fedora 版本 32(三十二)

1 Câu trả lời

1 000 000 次迭代大约需要 50 000 微秒。平均每次迭代不到 1μs, std::chrono::duration_cast将在小于 1μs 的任何时间舍入到 0 .这意味着您的循环只计算由于某种原因(调度、页面错误、缓存可能)花费比平均时间更长的迭代。
由于每次测量都有一个与所测量的持续时间(加上其他误差)无关的基本误差,因此进行多次小测量并将它们相加将比一次测量整个持续时间精确得多。

关于c++ - 简单 for 循环中的大量时间损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63799127/

28 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com