双精度数据类型的简单数学运算比浮点数据类型更快? [复制]

2024-03-26

可能的重复:
C# 中的双精度数比浮点数快吗? https://stackoverflow.com/questions/158889/are-doubles-faster-than-floats-in-c

我编写了简单的基准测试来检查我可以改变多少性能double数据类型为float在我的应用程序中。这是我的代码:

    // my form: 
    // one textbox: textbox1 (MultiLine property set to true)
    // one button: button1 with event button1_Click

    private void button1_Click(object sender, EventArgs e)
    {

        int num = 10000000;

        float[] floats1 = new float[num];
        float[] floats2 = new float[num];
        float[] floatsr = new float[num];  // array for results
        double[] doubles1 = new double[num];
        double[] doubles2 = new double[num];
        double[] doublesr = new double[num]; // array for results

        Stopwatch stw = new Stopwatch();

        log("Preparing data");

        Random rnd = new Random();

        stw.Start();

        for (int i = 0; i < num; i++)
        {
            floats1[i] = NextFloat(rnd);
            floats2[i] = NextFloat(rnd);
            doubles1[i] = rnd.NextDouble();
            doubles2[i] = rnd.NextDouble();
        }
        stw.Stop();
        log(stw.Elapsed.TotalMilliseconds.ToString()+"ms");
        stw.Reset();




        log("");


        stw.Start();
        for (int i = 0; i <# i++)
        {
            floatsr[i] = floats1[i] * floats2[i];
        }
        stw.Stop();
        log("Multiplying floats: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
        stw.Reset();



        stw.Start();
        for (int i = 0; i < num; i++)
        {
            doublesr[i] = doubles1[i] * doubles2[i];
        }
        stw.Stop();
        log("Multiplying doubles: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
        stw.Reset();


        stw.Start();
        for (int i = 0; i < num; i++)
        {
            floatsr[i] = floats1[i] / floats2[i];
        }
        stw.Stop();
        log("Dividing floats: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
        stw.Reset();


        stw.Start();
        for (int i = 0; i < num; i++)
        {
            doublesr[i] = doubles1[i] / doubles2[i];
        }
        stw.Stop();
        log("Dividing doubles: " + stw.Elapsed.TotalMilliseconds.ToString() + "ms");
        stw.Reset();

    }

    private void log(string text)
    {
        textBox1.Text = textBox1.Text + text + Environment.NewLine;
    }

    // I found that function somewhere on stackoverflow
    static float NextFloat(Random random)
    {
        double mantissa = (random.NextDouble() * 2.0) - 1.0;
        double exponent = Math.Pow(2.0, random.Next(-126, 128));
        return (float)(mantissa * exponent);
    }

我得到这样的结果(发布,无调试,Intel Mobile Core Duo T2500 2.0GHz 2MB CPU):

Preparing data 5275,6862ms

Multiplying floats: 442,7865ms 
Multiplying doubles: 169,4028ms
Dividing floats: 550,7052ms 
Dividing doubles: 164,1607ms

我很惊讶,对double几乎比操作快 3 倍float。我在这里搜索“double float”,发现了这个:

使用 double 比 float 快吗? https://stackoverflow.com/questions/3426165/is-using-double-faster-than-float

最佳答案集中在CPU架构上,但我不能同意这一点。

我怀疑其他原因导致浮点性能低下,因为我的带有 Intel SSE 的 CPU 应该能够一次乘法或除法 4 个浮点(打包浮点指令),或者一次乘法或除法 2 个双精度数。所以浮动应该更快。

也许编译器(或 .net 中的 clr)正在以某种方式优化内存使用?

有没有办法优化一下,让浮动更快?

请不要报告重复的问题,我看到了其他问题,但它们并不能令我满意。


更改生成浮点数的方法后的结果现在看起来不错(Servy 建议):

Preparing data 1367,0678ms

Multiplying floats: 109,8742ms 
Multiplying doubles: 149,9555ms
Dividing floats: 167,0079ms 
Dividing doubles: 168,6821ms

这与您生成随机数的方式有关。浮点数的乘法和除法并不完全相同;这些数字的实际值很重要。对于浮点数,您要在相当大的范围内填充一个值。如果您创建的浮点数位于 0 和 1 之间,就像双精度数一样,那么结果会更符合您的预期。只是改变NextFloat是这样的:

static float NextFloat(Random random)
{
    return (float) random.NextDouble();
}

我刚刚运行了一些测试,经过这一更改,浮点数的乘法速度提高了 33%。

当然,这只是使比较“公平”的最简单方法。为了更好地理解浮点数与双精度数的真正比较,您需要在各个类型的整个范围之间生成随机浮点数和双精度数,或者更好的是,两者都保存代表程序将使用的数据类型的值。

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

双精度数据类型的简单数学运算比浮点数据类型更快? [复制] 的相关文章

  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 具有可点击区域的可缩放 SVG - Android

    我正在做一个非常简单的应用程序 它需要显示一个包含广义世界地图的 SVG 通过单击城市名称 svg 矩形 我需要显示与该城市对应的另一个 SVG 此外 所有 SVG 都必须支持缩放和平移 我设法让 SVG 支持缩放和平移 效果非常完美 为此
  • Excel 加载项失败并显示 0x8004063E

    我有一个 Excel 添加 它曾经完美地工作 最近 许多客户收到以下错误 在这个问题的最后 环境详情 Windows 7 8 64 位 微软 Office 2013 64 位 Add in是在 net 3 5下编译的 任何帮助将不胜感激 H
  • Scala 模板将样式应用于 inputText 的标签 [Play 2 HTML5 辅助标签]

    我正在使用带有输入助手的 scala 模板 我使用的类属性应用样式
  • C# - Silverlight 中 .NET ArrayList.ToArray(Type) 的替换

    下面是我编写的一个简单方法 非常简化 所以我希望它仍然能够理解要点 用于获取字符串中数组元素的字符串表示形式 并将它们转换为这些值的实际数组 t 是数组的类型 DeserializeArray string sArrayElements o
  • 在 Tomcat 上安装 Sonar 和 Jenkins

    我有一个 tomcat 服务器 我想在上面安装 Jenkins 和 Sonar 我使用的是 debian 发行版 因此我通过 apt get 获得了 tomcat6 和 Jenkins 当我将 jenkins war 复制到 tomcat6
  • python:从程序运行交互式 python shell

    我经常遇到这样的情况 我将编写一个脚本 并且我正在编写脚本的一部分 我想以交互方式使用一些变量 到达该部分需要运行我已经编写的脚本的大部分 在这种情况下 从 shell 内部运行该程序并非易事 我必须以某种方式重新创建该函数的条件 我想做的
  • 为什么这不能是一个原始的?

    我正在摆弄 JavaScript 并注意到this永远不可能是原始的 我在说什么 让我解释 以这个函数为例 function test return typeof this test call Abc object test call 12
  • MVP 观点到底有多蠢?

    我正在尝试学习 MVP 但有些事情让我困惑 如果Presenter使用视图作为界面 那么View就不能只是控件的简单渲染 想象一下 尝试编写一个打字练习游戏 其中单词是随机生成到 UI 中的 用户必须在单词从屏幕上落下时输入单词 所以视图将
  • 以编程方式搜索 GMail?

    有没有什么方法可以以编程方式搜索 GMail 最好使用 C 例如 我想获取与搜索匹配的所有电子邮件标签 MyLabel 来自 电子邮件受保护 cdn cgi l email protection 以便我可以根据需要解析电子邮件正文 我发现的
  • 鼠标悬停在绝对定位的 div 上触发

    客观的 当将鼠标悬停在表格单元格上时 表格单元格的右上角会出现一个小的放大镜图标 将鼠标悬停在放大镜图标上并单击它将打开一个对话框窗口 以显示有关特定表格单元格中的项目的详细信息 我想为数百个表格单元重复使用相同的图标 而不是每次都重新创建
  • 以编程方式将库导入到 Databricks 中的工作区

    我想以编程方式添加一个 Python Wheel 库到 SharedDatabricks 上的工作区 在 GUI 中 工作区 gt 导入 gt 库 很容易做到 但我不知道如何在 Databricks CLI 中做到这一点 所以我想我有两种可
  • 如何删除solidity中的数组项

    我正在尝试删除 Solidity 数组中的某个项目 我正在探索一些文章 https ethereum stackexchange com questions 1527 how to delete an element at a certai
  • 获取 Linux 中 Windows 路径的基本名称

    假设我有一个包含 Windows 文件地址的字符串 比方说 local address C TEMP filename txt 从我使用的上述地址检索文件名 import os filename os path basename local
  • 如何计算按 toshortdatestring 分组的表的行数?

    我们有一个具有以下结构的数据库 public partial class ChartData public int Id get set public DateTime Timestamp get set public string Fun
  • java.lang.NoClassDefFoundError:com.google.android.gms.ads.AdView

    我正在编写一段代码来在我的 Android 应用程序中显示 Admob 横幅 为了实现这一目标 我做了以下一些调整 配置的谷歌播放服务库如下 https developers google com mobile ads sdk docs h
  • 在 Whatsapp Business Cloud api 中向多个收件人发送消息

    有没有一种方法可以在一个发布请求中向多个收件人发送消息 与我发送用分号分隔的电子邮件的方式相同 WhatsApp Business Cloud API 中没有选项可以一次性向多个电话号码发送消息 您必须一一发送或通过循环发送消息
  • React Material-UI 禁用处理程序中的按钮

    尝试在用户单击按钮后禁用该按钮 但通过处理程序函数 我参考过这两个类似的问题 React Material UI 禁用时如何为按钮提供自定义颜色 https stackoverflow com questions 55586626 reac
  • ASP.NET FileUpload:选择文件后如何自动回发?

    我正在开发 ASP NET 应用程序 在 FileUpload 控件中选择文件后 我需要回发到服务器 而不必让用户显式单击 提交 按钮 这可能吗 如果是这样 怎么办 我假设您想立即开始上传 如果是这样 您应该对此做出反应changeJava
  • 在 C++ 中访问父命名空间

    我有一个类似以下的场景 class criterion stuff about criteria namespace hex class criterion public criterion does not compile This sh
  • 双精度数据类型的简单数学运算比浮点数据类型更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的双精度数比浮点数快吗 https stackoverflow com questions 158889 are doubles faster than floats in c 我编写了简单的基