C#性能分析-如何计算CPU周期?

2023-12-03

这是进行性能分析的有效方法吗?我想要获得纳秒精度并确定类型转换的性能:

class PerformanceTest
{
    static double last = 0.0;
    static List<object> numericGenericData = new List<object>();
    static List<double> numericTypedData = new List<double>();

    static void Main(string[] args)
    {
        double totalWithCasting = 0.0;
        double totalWithoutCasting = 0.0;
        for (double d = 0.0; d < 1000000.0; ++d)
        {
            numericGenericData.Add(d);
            numericTypedData.Add(d);
        }
        Stopwatch stopwatch = new Stopwatch();
        for (int i = 0; i < 10; ++i)
        {

            stopwatch.Start();
            testWithTypecasting();
            stopwatch.Stop();
            totalWithCasting += stopwatch.ElapsedTicks;

            stopwatch.Start();
            testWithoutTypeCasting();
            stopwatch.Stop();
            totalWithoutCasting += stopwatch.ElapsedTicks;
        }

        Console.WriteLine("Avg with typecasting = {0}", (totalWithCasting/10));
        Console.WriteLine("Avg without typecasting = {0}", (totalWithoutCasting/10));
        Console.ReadKey();
    }

    static void testWithTypecasting()
    {
        foreach (object o in numericGenericData)
        {
            last = ((double)o*(double)o)/200;
        }
    }

    static void testWithoutTypeCasting()
    {
        foreach (double d in numericTypedData)
        {
            last = (d * d)/200;
        }
    }
}

输出是:

Avg with typecasting = 468872.3
Avg without typecasting = 501157.9

我有点怀疑......看起来对性能几乎没有影响。选角真的那么便宜吗?

Update:

class PerformanceTest
{
    static double last = 0.0;
    static object[] numericGenericData = new object[100000];
    static double[] numericTypedData = new double[100000];

    static Stopwatch stopwatch = new Stopwatch();
    static double totalWithCasting = 0.0;
    static double totalWithoutCasting = 0.0;
    static void Main(string[] args)
    {
        for (int i = 0; i < 100000; ++i)
        {
            numericGenericData[i] = (double)i;
            numericTypedData[i] = (double)i;
        }

        for (int i = 0; i < 10; ++i)
        {
            stopwatch.Start();
            testWithTypecasting();
            stopwatch.Stop();
            totalWithCasting += stopwatch.ElapsedTicks;
            stopwatch.Reset();

            stopwatch.Start();
            testWithoutTypeCasting();
            stopwatch.Stop();
            totalWithoutCasting += stopwatch.ElapsedTicks;
            stopwatch.Reset();
        }

        Console.WriteLine("Avg with typecasting = {0}", (totalWithCasting/(10.0)));
        Console.WriteLine("Avg without typecasting = {0}", (totalWithoutCasting / (10.0)));
        Console.ReadKey();
    }

    static void testWithTypecasting()
    {
        foreach (object o in numericGenericData)
        {
            last = ((double)o * (double)o) / 200;
        }
    }

    static void testWithoutTypeCasting()
    {
        foreach (double d in numericTypedData)
        {
            last = (d * d) / 200;
        }
    }
}

输出是:

Avg with typecasting = 4791
Avg without typecasting = 3303.9

请注意,您正在测量的不是类型转换,而是拆箱。这些值始终是双精度的,没有进行类型转换。

您忘记在测试之间重置秒表,因此您一遍又一遍地添加所有先前测试的累积时间。如果将刻度转换为实际时间,您会发现它加起来远远超过运行测试所花费的时间。

如果您添加一个stopwatch.Reset();在每个之前stopwatch.Start();,您会得到更合理的结果,例如:

Avg with typecasting = 41027,1
Avg without typecasting = 20594,3

拆箱一个值并没有那么昂贵,它只需要检查对象中的数据类型是否正确,然后获取该值。不过,这仍然比类型已知时要多做很多工作。请记住,您还测量结果的循环、计算和分配,这对于两个测试都是相同的。

装箱一个值比拆箱它更昂贵,因为这会在堆上分配一个对象。

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

C#性能分析-如何计算CPU周期? 的相关文章

  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在

随机推荐

  • 为什么它们会根据大小而以不同的方式连接?

    在 Postgresql 中 如果取消嵌套两个相同大小的数组 它们会将一个数组中的每个值与另一个数组中的每个值对齐 但如果两个数组大小不同 则会将一个数组中的每个值与另一个数组中的每个值连接起来 select unnest ARRAY 1
  • 如何循环访问 JavaScript 对象数组?

    我正在尝试循环以下内容 messages msgFrom 13223821242 msgBody Hi there msgFrom Bill msgBody Hello 我想找回msgFrom and msgBody 我试过了 for va
  • Android FAB 行为与自定义布局的列表视图

    我想实现与此示例类似的行为 但没有工具栏移动 并且适用于自定义视图 不适用于 FAB 所以 首先我想看到类似于https www google com design spec components bottom sheets html 它可
  • WebDev:进行多文件上传的最佳方法是什么?

    我希望 几乎不懂计算机的 人们通过我的网络应用程序轻松提交大量文件 图片 是否有一个简单 强大 免费 便宜 广泛使用的标准工具 组件 Flash 或 NET 抱歉浏览器上没有 java 运行时 允许 Web 用户在其计算机上选择一个文件夹或
  • 在 AsyncTask 中,如何“立即”而不是在每次循环之后将数据从 doInBackground() 传递到主 UI? (缓冲阅读器)

    EDIT1 我确实更改了代码 以便更新是在 while 循环内完成的 然而 没有改变 在下面的代码中显示了这一点 另外 删除了 onProgressUpdate 上的其他不相关行 如下面的代码所示 请像教业余爱好者一样回答 我当前正在将数据
  • 如何使用 React Router 和 Algolia 搜索命中?

    我正在使用 Algolia 的反应即时搜索 我想知道当我点击点击小部件中的 点击 时 我可以使用哪些代码将我发送到特定页面 我正在使用 Next js Code import React from react import useRef u
  • 对于 Rails 4/Postgres,对 schema.rb 中的列重新排序是否安全?

    在开发和生产中运行 Rails 4 和 Postgres 9 4 我有一个大表 随着时间的推移 它随着迁移而增长 由于表上有许多不同的列 我想重新排序 以便更逻辑地对列进行分组 换句话说 一些列元素根据它们捕获的信息自然地分组在一起 我发现
  • 在 Firefox 中使用 HTML5 音频播放 mp3 Shoutcast 流?

    我正在尝试使用 HTML5 音频播放 mp3shoutcast 流广播电台 我认为这不相关 但无论如何 这里是代码 var player new Audio player autobuffer true player src http 17
  • Sql Developer 上出现“IO 错误:网络适配器无法建立连接”问题的原因是什么?

    我建立了连接到数据库服务器 其他机器 的连接 然后我发现 执行请求的操作时遇到错误 IO 错误 网络适配器无法建立连接 供应商代码 17002 请查看下面 URL 中的图片 我尝试建立连接但无法访问 但我的团队可以访问它 我的朋友使用 TN
  • 将任意大数转换为基数 256

    我有一个号码非常大 长度可能达到50位 我将其作为字符串输入 但是 我需要对其执行操作 所以 我需要将它们转换为适当的基数 比如说 256 这样做的最佳算法是什么 多精度算术 又名bignums 是一个困难的主题 好的算法是不直观的 有关于
  • 如何使用Struts 2在Apache Tomcat应用程序中建立数据库连接

    我想在应用程序级别建立数据库连接 所以我想在web xmlApache Tomcat 服务器的文件 我正在使用 Struts2 MVC 框架开发我们的应用程序 实际上我不想在每个Java 文件上创建数据库连接 如何在应用程序中建立数据库连接
  • Directshow录制/预览问题

    我有一个项目 需要使用 DirectShow 从网络摄像头录制视频 但我需要能够在预览继续运行时停止录制 我正在使用 WPFMediaKit http wpfmediakit codeplex com 问题是 当我录制视频时 暂停功能也会暂
  • EclEmma 代码覆盖率插件和 PowerMockRunner

    我在Eclipse中使用EclEmma插件时遇到了问题 当我使用注释时它不显示代码覆盖率 RunWith通过 PowerMockRunner class 作为一个论点 如果使用 MockitoJUnitRunner class 一切安好 等
  • 如何更改 SwiftUI 中导航栏标题的文本属性?

    最近 我一直在尝试新的 SwiftUI 框架 我确实对该框架的工作原理有基本的了解 但我无法找到更改导航栏标题属性的方法 我使用的是最新的 Xcode 11 beta 5 和相应的 swift swiftUI 版本 我已经尝试过一些事情 我
  • C++\CLI 应用程序加载时崩溃

    我有一个 C 应用程序 它加载大量 C DLL 和一些选定的 C CLI DLL 在其中一台计算机 Windows Server 2003 SP2 上启动时收到错误消息 应用程序无法正确初始化 0xC0000005 单击 确定 终止应用程序
  • 如何在没有秒的情况下格式化 MySQL TIMEDIFF?

    我正在运行这个SELECT陈述 TIMEDIFF NOW posts date modified as time ago 并得到格式的结果02 58 32 最后一组数字 32 是秒数 我怎样才能省略秒 SELECT TIME FORMAT
  • iOS 的 Cordova healthkit 插件函数返回未定义?

    我正在尝试使用科尔多瓦插件健康我正在开发的phonegap应用程序的插件 每当我使用该应用程序时 每个插件都可以工作 但这个插件除外 我正在使用phonegap mac 应用程序在iPhone 6s 上进行测试 我已采取的步骤 安装的插件c
  • 仅在根进程上声明的数组

    特别是在 Fortran 的 MPI 中 仅在根进程上定义数组是否可能并且是一个不错的选择 例如这样的事情 program test implicit none include mpif h all mpi init ierr call m
  • 比较两个字符串并返回差异。 Python 3 [重复]

    这个问题在这里已经有答案了 我的目标是编写一个程序来比较两个字符串并显示前两个不匹配字符之间的差异 例子 str1 dog str2 doc 应该返回 gc 我知道我尝试使用的代码很糟糕 但我希望收到一些提示 这是我解决这个练习的糟糕尝试
  • C#性能分析-如何计算CPU周期?

    这是进行性能分析的有效方法吗 我想要获得纳秒精度并确定类型转换的性能 class PerformanceTest static double last 0 0 static List numericGenericData new List