小编Mar*_*rol的帖子

对两个连续测量进行基准测试时不一致

我在对一个函数进行基准测试时,发现某些迭代比其他迭代慢。

经过一些测试后,我尝试对两个连续的测量进行基准测试,但仍然得到一些奇怪的结果。

代码在wandbox上

对我来说重要的是:

using clock = std::chrono::steady_clock;
// ...
for (int i = 0; i < statSize; i++)
{
    auto t1 = clock::now();
    auto t2 = clock::now();
}
Run Code Online (Sandbox Code Playgroud)

正如我们在Godbolt上看到的那样,该循环已被优化

call std::chrono::_V2::steady_clock::now()
mov r12, rax
call std::chrono::_V2::steady_clock::now()
Run Code Online (Sandbox Code Playgroud)

该代码使用以下代码进行编译:

g++  bench.cpp  -Wall  -Wextra -std=c++11 -O3
Run Code Online (Sandbox Code Playgroud)

gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)安装在英特尔®至强®W-2195处理器上

我是计算机上的唯一用户,我尝试在没有优先级(nicechrt)的情况下运行,结果是相同的。

我经过1亿次迭代得到的结果是:

1亿次迭代

Y轴以纳秒为单位,是线的结果

std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
Run Code Online (Sandbox Code Playgroud)

这4行让我想到:没有缓存/ L1 / L2 / L3缓存未命中(即使“ L3缓存未命中”行似乎与L2行距离太近)

我不确定为什么会出现缓存未命中,可能是结果的存储,但是它不在测量的代码中。

我已尝试使用1500循环运行10000次程序,因为此处理器的L1缓存为: …

c++ linux performance caching performance-testing

8
推荐指数
1
解决办法
500
查看次数

emplace_back 中的 std::vector emplace_back 调用 UB 或 bug clang/gcc?

我的代码中有一个错误,当放回到同一向量中时,它试图放回一些值。

最小的例子

#include <iostream>
#include <vector>


struct ComplexObject
{
    // for display only
    inline static int cpt {};
    int indice {};

    ComplexObject(std::vector<ComplexObject>& storage, int trick) 
    {

        indice = cpt;
        cpt++;

        if (trick == 0 )
        {
            std::cout << "Creating single Object. Storage size: " << storage.size() << std::endl;
        }
        else
        {
            std::cout << "Creating double Object. Storage size: " << storage.size() << std::endl;
            storage.emplace_back(storage, 0);
            std::cout << "Storage size after double creation : " << storage.size() << std::endl;
        }

    } …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

7
推荐指数
0
解决办法
64
查看次数

标签 统计

c++ ×2

c++11 ×1

caching ×1

linux ×1

performance ×1

performance-testing ×1