小编Ada*_*amF的帖子

代码对齐会显着影响性能

今天我发现示例代码在添加了一些不相关的代码后速度降低了 50%。调试后我发现问题出在循环对齐上。根据循环代码的放置,有不同的执行时间,例如:

地址 时间[我们]
00007FF780A01270 980us
00007FF7750B1280 1500us
00007FF7750B1290 986us
00007FF7750B12A0 1500us

之前没想到代码对齐会有这么大的影响。我认为我的编译器足够聪明,可以正确对齐代码。

究竟是什么导致了执行时间的如此大的差异?(我想一些处理器架构细节)。

我用 Visual Studio 2019 在 Release 模式下编译的测试程序并在 Windows 10 上运行它。我在 2 个处理器上检查了程序:i7-8700k(上面的结果)和 intel i5-3570k 但问题不存在在那里,执行时间总是大约 1250us。我也试过用 clang 编译程序,但结果总是 ~1500us(在 i7-8700k 上)。

我的测试程序:

#include <chrono>
#include <iostream>
#include <intrin.h>
using namespace std;

template<int N>
__forceinline void noops()
{
    __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    noops<N - 1>();
}
template<>
__forceinline void noops<0>(){}

template<int OFFSET>
__declspec(noinline) void SumHorizontalLine(const …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86 assembly micro-optimization

6
推荐指数
1
解决办法
233
查看次数

外部功能

我的简单代码如下:

a.cpp:

#include <iostream>

namespace asd
{
    class B
    {
    public:
        void ss()
        {
            extern int i;
            std::cout << i;
        }
    };
}

int main()
{
    asd::B e;
    e.ss();
}
Run Code Online (Sandbox Code Playgroud)

b.cpp:

int i = 4;
Run Code Online (Sandbox Code Playgroud)

这个代码是标准的还是没有?Visual Studio编译它没有错误,但英特尔C++编译器说:未解析的外部符号"int asd :: i"(?i @ asd @@ 3HA)

如果我将b.cpp更改为:

namespace asd
{
    int i = 4;
}
Run Code Online (Sandbox Code Playgroud)

然后Visual Studio C++ 2013说:未解析的外部符号"int i"(?i @@ 3HA)

但是英特尔C++编译器说好了:)这段代码的正确版本是什么?如果我想在类成员函数中使用这个extern(它合法吗?)?

编辑:当我们将b.cpp更改为时,最好的结果是:

namespace asd
{
    int i = 4;
}
int i = 5;
Run Code Online (Sandbox Code Playgroud)

Visual c ++打印5,intel编译器4 :)

c++ icc visual-studio-2013

5
推荐指数
1
解决办法
3489
查看次数

如何正确等待条件变量超时

我正在研究简单的取消机制。但我发现等待条件变量超时存在问题。

让我们考虑以下示例程序: https: //www.cplusplus.com/reference/condition_variable/condition_variable/wait_for/ 看起来这个示例已损坏。如果有人非常快地提供数据,那么程序将进入无限循环。为了形象化它,我对示例程序做了一些修改:

#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <chrono>             // std::chrono::seconds
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable, std::cv_status
using namespace std::chrono_literals;

std::condition_variable cv;

int value = -1;

void compute() {
    value = 0;;
    cv.notify_one();
}

int main()
{
    std::thread th(compute);

    std::this_thread::sleep_for(1s);

    std::mutex mtx;
    std::unique_lock<std::mutex> lck(mtx);
    while (cv.wait_for(lck, std::chrono::seconds(1)) == std::cv_status::timeout) {
        std::cout << '.' << std::endl;
    }
    std::cout << "You entered: " << value << '\n';

    th.join();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于我无法快速输入,因此我只是将值设置为 …

c++ multithreading c++11

0
推荐指数
1
解决办法
6735
查看次数