C# 中 if 语句的性能 [关闭]

2024-03-10

我只是想确定在具有大量迭代的循环中使用每个“if”语句对 C# 应用程序性能的影响。我还没有找到与此相关的主题,因此我创建了这个主题。

对于测试,我做了 2 个循环:一个没有“if”,另一个只有一个“if”语句。代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace IfPerformance
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = 500000000;
            Stopwatch sw = new Stopwatch();

            double a = 0, b = 0;
            bool f;

            sw.Restart();
            for (int i = 0; i < N; i++)
            {
                a += 1.1;
                f = a < N;
            }
            sw.Stop();
            Console.WriteLine("Without if: " + sw.ElapsedMilliseconds + " ms");

            a = 0;
            sw.Restart();
            for (int i = 0; i < N; i++)
            {
                if (a < N)
                    a += 1.1;
                else
                    b += 1.1;
            }
            sw.Stop();
            Console.WriteLine("With if:    " + sw.ElapsedMilliseconds + " ms");
            Console.ReadKey();
        }
    }
}

我使用“优化代码”构建选项和“开始而不调试”运行测试。结果如下: 没有 if:154 毫秒 如果:742 毫秒

这意味着单个“if”语句会导致性能下降近 5 倍。我认为对此会有帮助。

另外,我注意到大循环中存在几个额外的“if”可能会使我的最终应用程序减慢 25%,我认为这很重要。

具体来说,我正在对一组数据运行蒙特卡罗优化,这需要对整个数据集进行多次循环。循环包含取决于用户设置的分支。从这一点开始,“如果”就出现了。

我在性能方面向专业人士提出的问题是:

  1. 循环中额外的“if”对运行多次迭代的时间有什么影响?
  2. 如何避免减速?

如果我走错了方向,请发表您的意见。


没关系 ... 您正在测试 5 亿次迭代......并且只需要不到一秒......在最坏的情况下......

正如评论所说,一开始你会遇到很大的麻烦,因为你不会在调试中运行来测试性能,即使这样,你也需要考虑很多其他事情(这是一个关于性能测试的整个世界,它并不像通常看起来那么简单)。

现在,请注意您在两个地方做了两件不同的事情。如果您想查看 if 的性能,您应该让它们做基本相同的事情。我确信分支会更改 IL 代码...

最后但并非最不重要的一点是,正如我再次说过的……这并不重要……除非您确实需要运行 5 亿次,并且在很多地方都有这样的情况,以至于您的程序因此开始变慢。

如果你能在 if 语句上节省几微秒,那就追求可读性而不是痴迷

请随意阅读这些文章埃里克·利珀特 https://stackoverflow.com/users/88656/eric-lippert (他“仅”拥有 250K 代表,并且 i̶s̶ 是 C# 编译器团队的主要开发人员:)谁能让你走上正确的方向:

  • C# 性能基准测试错误第 1 部分 http://tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one
  • C# 性能基准测试错误第 2 部分 http://tech.pro/tutorial/1295/c-performance-benchmark-mistakes-part-two
  • C# 性能基准错误第 3 部分 http://tech.pro/tutorial/1317/c-performance-benchmark-mistakes-part-three
  • C# 性能基准测试错误第 4 部分 http://tech.pro/tutorial/1433/performance-benchmark-mistakes-part-four

(说到这里,我猜垃圾收集(第4条)可能是需要考虑的事情......)

然后看:这个关于这个主题的详细答案 https://stackoverflow.com/a/15247691/1698987

最后但并非最不重要的一点是,看看编写更快的托管代码:了解事物的成本 http://msdn.microsoft.com/en-us/library/ms973852.aspx。作者是来自 Microsoft CLR 性能团队的 Jan Gray。我会诚实地说我没有读过这篇文章yet:)。不过我会的,稍后...

它继续...:)

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

C# 中 if 语句的性能 [关闭] 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 如何处理RecyclerView.ItemDecoration中的点击事件?

    我有一个 RecyclerView 带有 LinearLayoutManager 和一个自定义的 RecyclerView ItemDecoration 比方说 我想在装饰视图中添加按钮 出于某种原因 我用按钮填充布局 它正确绘制 但我无法
  • 为什么 getLocationOnScreen(location) 总是返回 0?

    In my FragmentLayout我有一个LinearLayout具有多个子视图 TextView CardView 我想找到所有的顶部偏移量LinearLayout意见但我总是得到零 这是我的代码 Override public V
  • 部分多键映射的数据结构?

    我的数据由映射到值的键组成 如下所示 Key Value 0 0 0 0 a 0 0 0 1 b 0 1 0 1 c 0 1 1 0 d 我正在寻找一种可以有效地对键执行搜索查询的数据结构 其中查询可以是完整或部分指定键 例如 0 0 0
  • 从 WP7 上的 xna 游戏启动 Internet Explorer

    我想知道是否可以从 Windows Phone 7 上运行的 XNA 游戏启动 Internet Explorer 我想将我的玩家重定向到我的网站 此致 我相信您仍然可以使用Web浏览器任务 http msdn microsoft com
  • ClojureScript 地图查找速度慢

    我有一个简单的地图 def my map 1 2 3 1 1 2 4 5 3 4 2 3 4 5 3 3 5 2 5 6 9 2 1 5 8 3 1 6 我用来执行查找的 然而 这表现得相当差 time doseq x range 500
  • Webpack 长期缓存

    Scenario 我正在尝试使用 webpack 将我的供应商脚本与我的应用程序脚本分开捆绑 尝试1 index js var require lodash console log webpack config js var path re
  • 如何在没有 Django 其余部分的情况下使用 Django 模板?

    我想在我的 Python 代码中使用 Django 模板引擎 但我没有构建基于 Django 的网站 如果没有 settings py 文件 和其他文件 并且必须设置 DJANGO SETTINGS MODULE 环境变量 如何使用它 如果
  • 如何获得 Java 软件商业许可? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我用 Java 编写了一个基于桌面的会计软件 我想放置密钥或许可证或其他类型的安全措施来防止客户端重新分发软件 我只是想知道该怎么办
  • 当对三个整数使用两次 = 运算符时,会发生什么? [复制]

    这个问题在这里已经有答案了 这是做什么的 int x 1 int y 2 int z 3 x y z 我在一些开源项目中遇到过多种此类事情 并且一直对它们感到困惑 我的意思是 运算符在三个整数上使用两次 即x y z 我需要理解这一点 谢谢
  • Visual Studio 无法在 Windows 10 上正确安装

    我将我的笔记本电脑升级到 Windows 10 无预览版 真正的东西 然后我安装了 Visual Studio Community Edition 2015 我已经安装了 VS 2013 这样我就可以开始使用 Cordova 功能 安装过程
  • 使用 p 值的逐步回归删除 p 值不显着的变量

    我想表演一个逐步线性回归 using p values作为选择标准 例如 在每个步骤中删除具有最高即最不显着 p 值的变量 当所有值均由某个阈值定义的显着时停止alpha 我完全知道我应该使用 AIC 例如命令step or stepAIC
  • 获取当前function()作用域的所有变量

    我有问题 我想获取当前的函数范围 我有这个示例代码 我工作正常 function nittle var Pen new Dot Generated dynamical through eval for key in window if wi
  • 使用 Boto3 从 S3 下载文件夹

    Using Boto3 Python SDK 我能够使用该方法下载文件bucket download file 有没有办法下载整个文件夹 Answer recommended by AWS collectives aws Collectiv
  • Python:如何使用 xlwt 编写复数到 Excel?

    我正在尝试使用以下命令将 Python 列表写入 Excel 文件xlwt图书馆 import xlwt from tempfile import TemporaryFile book xlwt Workbook sheet1 book a
  • 调用静态 JNI 方法从 C++ 返回字符串

    我正在尝试在Android中调用以下java方法 public static String getLevelFile String levelName body 从 C 使用以下 jni 代码 JniMethodInfoJavaApi me
  • 调用window.location.href后如何执行脚本?

    我有一个脚本可以将用户重定向到另一个页面 我想在新页面完全加载后将一些内容加载到新页面上的 div 中 我怎样才能做到这一点 以下不起作用 function goToPage window location href http www my
  • 如何在bash中测试变量是否以字符串开头?

    对于固定的前缀长度 我可以这样做 a filename 0 2 a echo temporary emacs file 对于任意前缀如何做到这一点 有更干净的方法吗 s 运算符在右操作数中采用模式 var 123 1234 var
  • 包设置不会传播到分布式的工作人员

    Info julia version julia version 1 6 0 lscpu root MyPackage lscpu Architecture x86 64 CPU op mode s 32 bit 64 bit Byte O
  • 图像具有绝对路径 - 如何在 Laravel Mix 中使用子目录 URL

    我的 Laravel Mix 应用程序将放置在服务器上的子目录中 例如 http localhost pat os server public http localhost pat os server public 我的 vue 组件中的图
  • C# 中 if 语句的性能 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我只是想确定在具有大量迭代的循环中使用每个 if 语句对 C 应用程序性能的影响 我还没有找到与此相关的主题 因此我创建了这个主题 对于测试