今天我发现示例代码在添加了一些不相关的代码后速度降低了 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) 我的简单代码如下:
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 :)
我正在研究简单的取消机制。但我发现等待条件变量超时存在问题。
让我们考虑以下示例程序: 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)
由于我无法快速输入,因此我只是将值设置为 …