随机数生成器性能因平台而异

2023-12-08

我正在测试 C++ 中随机数生成器的性能,并发现了一些我不明白的非常奇怪的结果。

我已经测试了 std::rand 与使用 std::minstd_rand 的 std::uniform_real_distribution 。

std::rand 计时代码

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    std::rand();

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";

使用 std:minstd_rand 计时 std::uniform_real_distribution 的代码

std::minstd_rand Mt(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_real_distribution<float> Distribution(0, 1);

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    Distribution(Mt);

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";

在 Dell Latitude 7390 (I7-8650U 1.9Ghz) 上使用 Microsoft Visual Studio 2019 进行编译时,我获得以下速度:

std::rand -> 经过时间:45.7106 ms std::uniform_real_distribution -> 经过时间:65.7437 ms

我使用 -D__FMA__ 的附加命令行选项打开了编译器优化

然而,当在 MacOS High Sierra (1.4Ghz i5) 上的 MacBook Air 上使用 g++ 进行编译时,我得到以下速度:

std::rand -> 经过时间:9.4547 ms std::uniform_real_distribution -> 经过时间:7.9e-05 ms

使用终端命令“g++ prng.cpp -o prng -std=c++17 -O3”

另一个问题是,在Mac上,测试uniform_real_distribution的速度,如果我打印/不打印该值,速度会有所不同。

So

std::minstd_rand Mt(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_real_distribution<float> Distribution(0, 1);

float num;

auto start = std::chrono::high_resolution_clock::now();

for (int i = 0; i < 1000000; ++i)
    num = Distribution(Mt);

auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - start;
std::cout << "Elapsed time: " << elapsed.count() * 1000 << " ms\n";
std::cout << num << '\n';

会给我 5.82409 毫秒的时间

而如果不打印,我会得到 7.9e-05 毫秒,请注意,打印只会影响uniform_real_distribution 的测试,我不需要对std::rand 执行此操作。我还使用 mersenne 进行了测试,而不是遇到同样的问题。

我最初认为这是编译器优化在未存储/打印uniform_real_distribution时省略了uniform_real_distribution,因为变量没有被使用,因此可以被省略,但是为什么编译器不为std::rand做同样的事情,为什么这些随机函数在 Mac 上的运行速度比 Windows 上快吗?

编辑: 为了澄清起见,mersenne 指的是使用 std::mt19937_64 而不是 std::minstd_rand 来实现uniform_real_distribution。


C++ 标准库中的所有发行版(包括uniform_real_distribution)使用实现定义的算法。 (这同样适用于std::rand,遵循 C 标准的rand函数。)因此,在 C++ 标准库的不同实现中,这些发行版之间自然会存在性能差异。也可以看看这个答案.

您可能想尝试测试 C++ 随机引擎是否存在性能差异(例如std::minstd_rand and std::mt19937),它确实在 C++ 标准中指定了固定算法。为此,请直接在引擎中生成随机数,而不是通过任何 C++ 发行版,例如uniform_int_distribution or uniform_real_distribution.


我最初认为这是编译器优化在未存储/打印uniform_real_distribution时省略了uniform_real_distribution,因为变量没有被使用,因此可以被省略,但是为什么编译器不为std::rand[?]做同样的事情?

我认为编译器可以进行此优化,因为实际上,C++ 标准库被实现为编译器可用的 C++ 代码,以便编译器可以根据需要对该代码执行某些优化。这与std::rand,它仅作为一个函数实现,其实现对编译器不可用,限制了编译器可以进行的优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机数生成器性能因平台而异 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 是否可以使用“git gc”来打包引用日志对象?

    正如答案所暗示的https stackoverflow com a 32025729 https stackoverflow com a 32025729我已经配置了远程裸仓库 git config gc pruneExpire never
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • SignalR 似乎正在减慢我的 MVC/Azure 应用程序的启动速度

    我有一个 MVC 应用程序在 Windows Azure 上的 WebRole 上的 NET 4 5 下运行 使用 SignalR 1 0 alpha2 并使用 ServiceBus 底板 在我的 App Start 文件夹中 我有 Reg
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName

随机推荐

  • 如何从 XML 反序列化 Java 对象?

    我确信这可能已经被详细讨论过或之前得到过回答 但是我需要更多关于适合我的情况的最佳方法的信息 Problem 我们有一些大型 XML 数据 从 100k 到 5MB 不等 需要将其膨胀为 Java 对象 问题是数据实际上根本不能很好地映射到
  • QSqlDatabase:如何避免“qt_sql_default_connection”仍在使用和重复连接相关警告?

    抱歉 如果这是一个微不足道的问题 但我一直在尝试构建一个使用的小型 uiQSQLITE作为数据库并使用QTableView以显示默认数据库文件的 4 列为例 我调试了各个方面的问题 改变了逻辑运算SQL并以更简单的方式重构构造函数 但错误仍
  • 解析分析不跟踪自定义事件[重复]

    这个问题在这里已经有答案了 我正在使用 Parse 来跟踪我的项目的一些自定义事件 在我的第一个版本中 我只是使用 PFAnalytics trackEvent Some event string This works 但后来我决定跟踪更多
  • 删除 C++ STL 中包含向量的动态分配对象

    我有课 class ChartLine protected vector
  • 将系统(文件)命令的输出存储为 C 中的字符串

    要获取文件的类型 我们可以执行命令 system file mime type b filename 输出显示在终端中 但无法使用该命令存储文件类型 char file type 40 system file mime type b fil
  • 可以使用自闭合 DIV 标签吗? [复制]

    这个问题在这里已经有答案了 可能的重复 自关闭标签在 HTML5 中有效吗 例如 div div 然后将使用 Javascript 来填充此 div 这是有效的 HTML 吗 不 HTML 4 x 没有任何自闭合标签的概念 它在 XHTML
  • 翻转滚动条 WPF

    你好 我正在构建一个显示从 0 到最大值的标尺的控件 0 值位于底部 最大值位于高于 0 的 y 值 最大值在我们滚动到它之前不可见 问题是 当0向下时 最大值向上 滚动条的0值向上 最大值向下 我希望滚动条能够翻转 我怎样才能做到这一点
  • 如何在 AngularFire 0.5.0 中从 .$on('loaded') 访问加载的数据

    我在 AngularFire 0 5 0 中使用 on 方法访问从 firebase 加载的数据时遇到问题 在回调中 当我注销范围的内容时 数据就在那里 但是当我尝试使用更深层次的数据时 我得到了undefined 也许我误解了您如何用这种
  • Bokeh 中的日期时间轴

    对于我的图 我想在散景中使用 日期时间 选项 如下所示 top figure width 900 height 500 x axis type datetime 我的 x 轴数据采用 datetime time 格式 x time date
  • Python Tkinter 可滚动框架类?

    我想做一个Tkinter class 基于答案在这里 这是一个Frame自动显示 隐藏Scrollbar根据需要围绕内容 我上面链接的答案非常适合我的需求 但需要注意的是 因为它不包含在class 它不可重复使用 我认为这会非常快速和简单
  • 在今天的特定小时和分钟创建 NSDate

    我怎样才能创建一个NSDate今天的日期和小时 分钟和秒分别为 5 0 和 0 IE 日期将为 07 02 2010 05 00 00 Gives us the current date NSCalendar gregorian NSCal
  • jplayer在一页中显示多个mp3文件链接

    我在页面中使用 jplayer 当单击链接时我想播放单击的链接 但是每次播放 test1 mp3 时 我该如何解决 代码如下 如果需要的话页面如下 http www dilyurdu com audio htm function liste
  • desc 附近的 SQL 语法错误 [重复]

    这个问题在这里已经有答案了 我得到的错误是 com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解使
  • Codeigniter 中的选择框验证

    我是 Codeigniter 的新手 在选择框验证方面遇到一些问题 我想要在开始时默认选择值
  • 由于规范中的日期格式,gemspec 无效

    当我在 Gemfile 中包含我制作的 gem 时 感谢 Bundler 版本 1 0 12 然后我尝试像这样捆绑或 rake rake 我收到此错误消息 Invalid gemspec in Users zagzag rvm gems r
  • 顺利地将对象移动到目的地 Unity3D

    我一整天都在尝试从point A to point B顺利 所以我尝试了Lerp 朝着去 and 平滑阻尼但每次物体都会从A点消失并立即出现在B点 我尝试了在互联网上找到的所有解决方案 但得到了相同的结果 你能救我一命并帮我解决这个问题吗
  • 您的 Ruby 版本是 2.1.0,但您的 Gemfile 指定为 2.0.0

    在我的 Gemfile 中 我指定了 ruby 版本 2 0 0 ruby 2 0 0 但我的控制台告诉我我有 2 1 0dev ruby v ruby 2 1 0dev 2013 09 16 trunk 42951 x86 64 darw
  • 如何存储具有数十亿个节点和顶点的大型有向未加权图

    图的大小为数十亿个节点和数百亿个顶点 它将存储网页 URL 以及网页之间的链接 并将用于测试排名算法 任何语言都可以 但java是首选 到目前为止我找到的解决方案 neo4j 存储在排序的平面文件中 是的 我已经读过存储 访问有向图的最佳方
  • Ada 95:修改字典程序的输出

    我找到了这本词典作者 William Whitaker 在互联网上 我喜欢它的解析能力 但输出不适合我 问题 对我来说是挑战 给定输入形式 例如 audiam 程序将返回以下输出 纯文本 audi am V 4 1 PRES ACTIVE
  • 随机数生成器性能因平台而异

    我正在测试 C 中随机数生成器的性能 并发现了一些我不明白的非常奇怪的结果 我已经测试了 std rand 与使用 std minstd rand 的 std uniform real distribution std rand 计时代码