我是一名有用的助手,可以进行文本翻译。以下是需要翻译的内容:
在我的电脑上,这个输出结果是:
为什么从真实分布中采样所需的时间比从整数分布中采样所需的时间更少?
更新 libc++和libstdc++表现出完全相反的行为,我仍在研究实现差异所在。参见 libc++ vs. libstdc++。
我在我的一个应用程序中遇到了性能下降的问题,我将其追溯到随机数据的生成。我编写了一个简单的基准测试,本质上做了同样的事情:
#include <chrono>
#include <iostream>
#include <random>
std::mt19937 random_engine{std::random_device()()};
// Generate one million random numbers
template <typename T, typename Distribution>
std::vector<T> generate_random(Distribution distribution) {
std::vector<T> data(1000000);
std::generate_n(data.begin(), 1000000, [&]() {
return static_cast<T>(distribution(random_engine));
});
return data;
}
template <typename T>
std::vector<T> create_data() {
if constexpr (std::is_same_v<T, float>)
return generate_random<float>(
std::uniform_real_distribution<float>(-127.0f, 127.0f));
if constexpr (std::is_same_v<T, int8_t>)
return generate_random<int8_t>(
std::uniform_int_distribution<int32_t>(-127, 127));
}
int main() {
auto start = std::chrono::system_clock::now();
auto float_data = create_data<float>();
std::cout << "Time (float): " << (std::chrono::system_clock::now() - start).count()
<< '\n';
start = std::chrono::system_clock::now();
auto int8_data = create_data<int8_t>();
std::cout << "Time (int8): " << (std::chrono::system_clock::now() - start).count()
<< '\n';
return 0;
}
在我的电脑上,这个输出结果是:
〉g++ -v
...
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.5.0
...
〉g++ tmp.cpp -std=c++17 -O3 && ./a.out
Time (float): 68033
Time (int8): 172771
为什么从真实分布中采样所需的时间比从整数分布中采样所需的时间更少?
更新 libc++和libstdc++表现出完全相反的行为,我仍在研究实现差异所在。参见 libc++ vs. libstdc++。
std::uniform_int_distribution<int32_t>(127, -127)
中,-127
应该放在前面。即使修复了这个问题,你仍然得到相同的结果,我不确定原因,所以我会留给其他人来解决。 - NathanOliverint8_t
给出较小的数字,而GCC则相反。使用不同的实现(例如使用特化而不是if constexpr
)没有任何区别,除非添加第三个使用int32_t
的测试,其中int8_t
情况突然改善。最后,在generate_random
中删除那个static_cast
有助于整体性能。 - Some programmer dude