gpt4 book ai didi

c++ - 什么更快?对一个 int 取模,或者将 int 除以 MAX_INT 得到一个 float ,然后乘以所需的模值并转换回 int?

转载 作者:行者123 更新时间:2023-11-27 22:34:36 25 4
gpt4 key购买 nike

什么更快:

random() % 100;

static_cast<int>((random() / 4294967296) * 100);

我真的不知道如何正确地进行基准测试,在我的电脑上看起来更快的东西在其他电脑上可能效果不一样,这就是为什么我谦虚地向 Stackoverflow 上的聪明人提交这个问题

最佳答案

生成随机数可以通过 rand() 完成。或 std::mt19997 .后者是首选,我仍然对这两种情况进行了基准测试。 (Visual Studio 2017 社区 x64)。我使用了一个虚拟变量,这样编译器就不能忽略随机生成语句。 rand() 返回一个 intstd::mt19937 返回一个 std::uint32_t。因此,为了减少转换次数,我使用了 2 个虚拟变量。

#include <iostream>
#include <random>
#include <chrono>
#include <limits>
#include <string>
#include <cstdlib>

namespace util {
constexpr std::size_t loop{ 10'000'000u };
std::mt19937 engine{ std::random_device{}() };
int rand_dummy{ 0 };
std::uint32_t mt19937_dummy{ 0u };
}

void rand_mod() {
for (std::size_t i = 0u; i < util::loop; ++i) {
util::rand_dummy = (rand() % 100);
}
}
void rand_div() {
for (std::size_t i = 0u; i < util::loop; ++i) {
util::rand_dummy = static_cast<int>(static_cast<double>(rand()) / RAND_MAX * 100);
}
}

void mt19937_mod() {
for (std::size_t i = 0u; i < util::loop; ++i) {
util::mt19937_dummy = (util::engine() % 100u);
}
}
void mt19937_div() {
for (std::size_t i = 0u; i < util::loop; ++i) {
util::mt19937_dummy = static_cast<std::uint32_t>(static_cast<double>(util::engine()) / std::numeric_limits<std::uint32_t>::max() * 100u);
}
}

void benchmark(void(*f)(void), const std::string& name) {
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << name << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() / 1e6 << "ms\n";
}

int main() {
srand(std::random_device{}());

benchmark(rand_mod, "rand() | mod: ");
benchmark(rand_div, "rand() | div: ");
std::cout << "---------------------------\n";
benchmark(mt19937_mod, "std::mt19937 | mod: ");
benchmark(mt19937_div, "std::mt19937 | div: ");

return util::rand_dummy + util::mt19937_dummy;
}

禁用优化 (/Od):

rand()       | mod: 956.128ms
rand() | div: 796.235ms
---------------------------
std::mt19937 | mod: 437.885ms
std::mt19937 | div: 584.477ms

全面优化 (/Ox):

rand()       | mod: 276.092ms
rand() | div: 262.224ms
---------------------------
std::mt19937 | mod: 61.4312ms
std::mt19937 | div: 103.38ms

  • std::mt19937 在这两种情况下都更快

  • 对于 std::mt19937 模数胜过除法

  • 对于 rand() 除法胜过模数

所以要看你用的是哪个。由于 std::mt19937 优于 rand(),答案应该是:取模比除法快。

> why rand() is considered harmful >


注意你也不应该这样做:

engine() % 100;

相反,使用 std::uniform_int_distribiution(0, 99)(engine);

[引擎是一个std::mt19937]

关于c++ - 什么更快?对一个 int 取模,或者将 int 除以 MAX_INT 得到一个 float ,然后乘以所需的模值并转换回 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com