江门网站推广哪家好长沙建网

news/2025/9/24 18:05:35/文章来源:
江门网站推广哪家好,长沙建网,做网站之前需要准备什么条件,怎么做网站不被发现使用Benchmark.NET对C# 代码进行基准测试的简介在我以前的文章中[10]#xff0c;我介绍了该系列文章[11]#xff0c;在其中我将分享我的经验#xff0c;同时了解C#xff03;和.NET Core#xff08;corefx#xff09;框架的新性能。在本文中#xff0c;我想着重于对现有… 使用Benchmark.NET对C# 代码进行基准测试的简介在我以前的文章中[10]我介绍了该系列文章[11]在其中我将分享我的经验同时了解C和.NET Corecorefx框架的新性能。在本文中我想着重于对现有代码进行基准测试并建立基准。为什么要对C#代码进行基准测试我开始进行基准测试的原因是在我们能够并且应该开始优化代码之前我们应该首先了解我们的当前位置。这对于确保我们的变更正在产生我们所希望的影响并且最重要的是不使我们的性能变差至关重要。以我的经验性能工作是一个反复的过程或度量需要进行小的更改并再次进行度量以检查更改的效果。可以说在本系列文章中我可能已经开始了其他一些工作可能是通过概要分析跟踪或度量收集。所有这些可能都是必需的以便针对应优化的服务并在代码级类和方法上成为您的目标。我决定暂时跳过这些更高级别的技术部分原因是我对这些领域并不完全有信心当然我可以为他们提供良好的指导。而且它们是有关性能的一系列主题我认为这会分散我对语言和框架功能的关注。对于实际情况您可能需要使用此类技术来首先缩小应该花费时间进行优化的位置。对于真实的场景您可能需要首先使用这些技术来缩小您应该花时间优化的位置范围。有时可以做出正确的猜测但只要有可能最好是在你的努力中具有科学性并以实际数据支持理论。我可能有一天会回到这些更广泛的领域但是现在我假设您对要改进的代码路径有所了解。如果您确实想了解有关对代码进行概要分析的更多信息那么我阅读了Konrad Kokosa的 “Pro .NET Memory Management: For Better Code, Performance, and Scalability[12]”这本书并从中学到了很多东西。基准测试是在代码的典型条件下确定当前性能的过程。在.NET中在代码级别有许多可行的技术。有时使用简单的秒表将是收集常规计时数据的起点。请注意许多情况可能会影响您的测量及其准确性。秒表的优点是使用简单可以快速提供结果。我认为以这种方式收集一些基本数据没有什么错只要可以理解准确性的折衷即可。一旦将注意力集中在代码的特定领域您就会开始深入到方法级别。在这一点上开始为现有方法和代码记录更准确和特定的基准非常有用。这是基准测试应成为您选择的工具的地方。在C中我们有一个Benchmark.NET[13]形式的绝佳选择。该库提供了大量基准测试工具可用于测量和基准测试.NET代码。现在Microsoft团队经常使用Benchmark .NET来衡量其代码。什么是基准基准仅仅是与某些代码的执行有关的一种测量或一组测量。通过基准测试您可以在开始努力提高性能时比较代码的相对性能。基准测试的范围可能很广或者您经常会发现自己正在测试微观基准的微小变化。最主要的是确保您具有一种机制可以将建议的更改与原始代码进行比较从而指导优化工作。在优化代码时使用数据而不是假设很重要。如何对C代码进行基准测试希望到现在为止您已经对基准的概念有所了解所以让我们从一个简单的例子开始。如果您想继续阅读可以在此示例存储库[14]的“基准”分支上找到此文章的完整代码。public class NameParser{public string GetLastName(string fullName){var names fullName.Split( );var lastName names.LastOrDefault();return lastName ?? string.Empty;} } 假设我们已经确定以下NameParser是我们的应用程序在重负载和潜在性能瓶颈下的一个区域。 此代码是一个简单的实现用于从输入字符串中返回姓氏该字符串被假定为人的全名。就本演示而言它假定最后一个单词在任何空格代表姓氏之后。目前这只是一个简化的示例您可能要进行基准测试的方法可能会完成更复杂的工作有时您可以从现有代码库中直接引用和基准测试代码这些方法足够小且公开。在其他时候我发现自己通过将代码的相关部分复制到我的基准测试项目中来创建基准测试以便将重点放在特定的代码行上。我需要在这方面花更多的时间来确定围绕构建基准的良好做法。1、安装Benchmark.NET库第一步是安装Benchmark.NET库。通常因为您可能已经在进行单元测试所以您将创建一个单独的项目来保存基准。在此基准测试项目中您将引用包含要基准测试的代码的项目。为了使我的示例保持简单我现在将所有内容留在一个项目中。对于一般基准您只需要NuGet的主要BenchmarkDotNet软件包。我通过在命令行中使用“ dotnet add package BenchmarkDotNet –version 0.11.3” 将其添加到示例项目中来安装我的系统。2、建立基准下一步是通过创建一个包含基准的新类来创建基准基准测试类将由Benchmark.NET运行并且任何基准测试方法的结果将包含在输出中。这是我的NameParserBenchmarks类。[MemoryDiagnoser]public class NameParserBenchmarks{private const string FullName Steve J Gordon;private static readonly NameParser Parser new NameParser();[Benchmark(Baseline true)]public void GetLastName(){Parser.GetLastName(FullName);} } 类本身用BenchmarkDotNet.Attributes命名空间中的属性标记。Benchmark.NET具有诊断程序的概念可以控制要测量并包含在结果中的事物。在没有附加任何附加诊断程序的情况下它将仅提供基准数据的时序数据。内存诊断程序支持分配和GC收集的其他度量这在优化代码时非常有帮助。在前面的代码中我有一个名为GetLastName的方法该方法通过调用它对NameParser类中现有的GetLastName方法进行基准测试。我已经用Benchmark属性标记了此方法以便Benchmark.NET执行该方法并将其包含在结果中。我可以在此处为基线属性提供一个值以将该特定方法标记为基线。这是我们正在测量的现有代码以后将很有用因为所有其他基准都将与该初始代码进行比较。为了支持基准测试我在基准测试中包含了要解析的名称的静态字符串值。我还包括一个静态字段其中包含对新NameParser实例的引用。我不想将它们包括在Benchmark方法本身中因为我想单独测量GetLastName方法的性能和分配。3、运行Benchmark.NET最后一步是为Benchmark.NET设置并触发运行程序。在此示例中我将运行单个项目中的所有内容因此将更新Program类的Main方法。通用的BenchmarkRunner.Run方法的调用接受应为其运行任何基准的类。默认情况下基准测试结果将记录到控制台。public class Program{public static void Main(string[] args){var summary BenchmarkRunner.RunNameParserBenchmarks();}} 执行基准在此阶段我们准备运行基准测试。为了获得最佳结果建议您在运行最少的设备上执行此操作。关闭所有其他应用程序并杀死不必要的进程将产生最稳定的结果。在开发机器上一旦一切都关闭我将触发从命令行运行基准测试。应针对发布代码运行基准测试以确保包括所有优化。在我的项目目录中我将运行“ dotnet build -c Release”以创建一个发布版本。构建完成后我可以导航到包含构建代码的文件夹“ cd bin / Release / netcoreapp2.2”最后我可以通过对示例应用程序使用“ dotnet BenchmarkAndSpanExample.dll”运行构建的程序集来运行基准测试。运行基准测试所需的时间长短取决于您的计算机和受测试的代码。Benchmark.NET执行许多阶段来预热代码并确保运行多次迭代以提供一致的统计数据。它使用一个试验阶段来计算要运行的最佳迭代次数尽管您可以根据需要进行配置。解释结果完成后您应该将摘要结果写入控制台窗口。如果愿意可以在运行应用程序的位置下的BenchmarkDotNet.Artifacts文件夹中生成各种输出。其中包括摘要的HTML版本可以更轻松地共享。我的机器的摘要如下所示图片对于每种基准测试方法您将在一行中包含结果数据。在这里我只有一行用于我的GetLastName方法的基准测试。平均执行时间为125.8纳秒不是太寒酸其他统计数据可用于迭代中时序数据的误差和标准偏差。因为我包括了memory diagnosticr属性所以我包括了一些额外的列其中包含与内存相关的统计信息。前三列与GC集合有关。它们按比例缩放以显示每1,000个操作的数量。在这种情况下必须经常调用我的方法才能触发Gen 0集合并且不太可能导致Gen 1或Gen 2集合。最后一栏非常有帮助它显示了每个操作分配的内存。我的名称解析器代码当前每次被分配160个字节。在宏伟的计划中这根本不算什么但是我们将在以后的文章中看到如何减少这种情况。请记住尽管.NET中的分配很便宜但GC收集和清理这些对象的工作可能会带来更多影响。在热路径被称为方法中这很快就会加起来。在我的第一篇文章中[15]我提到了一个工人流程该流程每天维护17至2000万个事件。如果在处理每个事件时需要调用此GetLastName方法则每天将导致3.2GB的分配如此规模如此之小很快就可以加起来摘要在尝试对代码进行任何优化工作之前始终先建立基线是非常重要且重要的。这样您可以真正看到改进后的代码是否比原始代码更快和/或分配的更少。评估改进可以帮助指导进一步的优化并且还可以提供关键数据这些数据可以证明花费时间进行此类改进的代码。使用Benchmark.NET之类的工具进行基准测试非常简单只需进行简单的工作几乎不需要花什么功夫就可以轻松比较代码性能。在本文中我们已经了解了如何使用Benchmark .NET为现有代码提供基线以了解其运行速度和分配的内存量。在下一篇文章中我将介绍Span我们将使用Benchmark .NET来衡量改进。谢谢阅读如果您想了解有关高性能.NET和C代码的更多信息可以在此处[16]查看我的完整博客文章系列。References[1] Writing High-Performance .NET Code: https://www.amazon.co.uk/gp/product/0990583457/refas_li_tl?ieUTF8camp1634creative6738creativeASIN0990583457linkCodeas2tagstevejgordon-21linkId9345b81c7b89459a2015a61e7470abb9[2] 编写高性能.NET代码: https://item.jd.com/15217405980.html[3] Pro .NET Memory Management: For Better Code, Performance, and Scalability: https://www.amazon.com/Pro-NET-Memory-Management-Performance/dp/148424026X/refsr_1_1?__mk_zh_CN%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99keywords.NETMemoryManagementqid1583662848sr8-1[4] Blogs: https://adamsitnik.com/[5] talks: https://www.youtube.com/watch?vCSPSvBeqJ9c[6] 博客: https://adamsitnik.com/[7] 演讲: https://www.youtube.com/watch?vCSPSvBeqJ9c[8] 博客: https://blog.marcgravell.com/[9] 在此处: https://www.stevejgordon.co.uk/writing-high-performance-csharp-and-dotnet-code[10] 以前的文章中: https://www.stevejgordon.co.uk/motivations-for-writing-high-performance-csharp-code[11] 文章: https://www.stevejgordon.co.uk/motivations-for-writing-high-performance-csharp-code[12] Pro .NET Memory Management: For Better Code, Performance, and Scalability: https://www.amazon.co.uk/gp/product/148424026X/refas_li_tl?ieUTF8camp1634creative6738creativeASIN148424026XlinkCodeas2tagstevejgordon-21linkIdfc3f451494b7fdcefdfa03674f1cd2da[13] Benchmark.NET: https://benchmarkdotnet.org/[14] 此示例存储库: https://github.com/stevejgordon/BenchmarkAndSpanExample/tree/Benchmarks[15] 第一篇文章中: https://www.stevejgordon.co.uk/motivations-for-writing-high-performance-csharp-code[16] 在此处: https://www.stevejgordon.co.uk/writing-high-performance-csharp-and-dotnet-code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西电PCB设计指南第4章学习笔记

西电PCB设计指南第4章学习笔记 四、电源路径分析电源路径的基本原理回路路径与感抗 感抗与路径有关,信号线看似很短很直,但是引入了较大的环路感抗。多路信号线的环路之间的互感,造成相互干扰 所以,我们不能但按照…

图像处理去除噪点验证码的识别逻辑实践

验证码设计中常见的防护手段之一就是加入随机噪点,让字符边缘不清晰,从而干扰自动识别。本文介绍一种基于图像滤波与形态学操作的处理流程,帮助提取出清晰的字符区域。 一、问题分析 噪点验证码的典型特征是: 图像…

读取zip包中的文件

private List<String> readFile(String zipFilePath,String fileName){File file = new File(zipFilePath);List<String> list;System.out.println(file.getName());//20250709-5427327003468403533.ziptr…

网站开发合同知识产权手机在线制作图片加字

来源&#xff1a;图灵人工智能作者&#xff1a;王健宗等https://wwwihcm/people/euu-lin-jun-7原文链接&#xff1a;https://kns.cnki.net/kcms/detail/31.1289.tp.20201123.1641.002.html摘要&#xff1a;随着计算机行业和互联网时代的不断发展与进步&#xff0c;图神经网络已…

网站营销的优缺点网站视觉

2010/2/8号 星期一 1.决定记录下每天学到的东西和感悟 2.看老赵的博客&#xff0c;学到一句话&#xff1a;Apple告诉我们的铁律是&#xff1a;表面功夫一定要做足。 3.看到一个笑话&#xff1a;你属什么&#xff1f;我属 于你。 2010/2/9号 星期二 1.减少页面中独立的请求数&…

轻松建站网站建设图片如何加载

本文将综合运用 C++11 中的新的基础设施(主要是多线程、锁、条件变量)来阐述一个经典问题——生产者消费者模型,并给出完整的解决方案。 生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源。本文将就四种情况分析并介绍生产…

Java文件上传和其他参数一起提交的案例

Java文件上传和其他参数一起提交的案例package cn.daenx.demo.controller;import cn.daenx.demo.Aoidj; import cn.hutool.core.util.ObjectUtil; import org.springframework.web.bind.annotation.*; import org.spri…

Attention复杂度解析与改进方向

Attention复杂度解析与改进方向Attention复杂度解析与改进方向 摘要/引言 在大规模语言模型(LLM)浪潮中,扩展模型上下文窗口长度被认为是提升模型能力和应用范围的关键方向。然而,现代Transformer结构中的自注意力…

实用指南:Qt的数据库模块介绍,Qt访问SQLite详细示例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站后台程序设计常用语言 技术的分析比较注册小规模公司流程及费用

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

泉州快速建站模板免费推广网站

作者 | 阚俊宝 阿里巴巴技术专家参与文末留言互动&#xff0c;即有机会获得赠书福利&#xff01;导读&#xff1a;云原生存储详解系列文章将从云原生存储服务的概念、特点、需求、原理、使用及案例等方面&#xff0c;和大家一起探讨云原生存储技术新的机遇与挑战。本文为该系列…

三维模型非结构化网格生成

三维非结构化网格生成方案,包含多种算法和MATLAB实现。 1. 基础类和数据结构 classdef Mesh3D < handleproperties% 网格基本数据nodes % 节点坐标 (N3)elements % 单元连接关系 (M4 四面体 或 M8 …

Windows 环境变量配置

在实际项目开发中,往往需要配置各种各样的环境变量。在使用部分windows电脑时,无法获取Admin权限,使用页面配置环境变量会受到限制。这时我们可以使用CMD命令行进行环境变量配置,具体配置步骤如下: 1.打开CMD窗口…

React自定义同步状态Hook - 详解

React自定义同步状态Hook - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

Playwright MCP浏览器自动化指南 - 详解

Playwright MCP浏览器自动化指南 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

完整教程:【C++】STL简介+编码表+string引入

完整教程:【C++】STL简介+编码表+string引入pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

付费的网站推广该怎么做合肥网络公司 网站建设

摘要 spark的调度一直是我想搞清楚的东西&#xff0c;以及有向无环图的生成过程、task的调度、rdd的延迟执行是怎么发生的和如何完成的&#xff0c;还要就是RDD的compute都是在executor的哪个阶段调用和执行我们定义的函数的。这些都非常的基础和困难。花一段时间终于弄白了其中…

SpringBootMVC相关内容

SpringMVC 基于java实现MVC模型的轻量级Web框架 做Web程序开发 当我们的浏览器发出一个请求给到后端服务器以后,由servlet负责处理请求, servlet只是能够接收请求产生响应,不能进行真正的数据处理 于是将后端服务拆…

小柏实战学习Liunx(图文教程三十五)

小柏实战学习Liunx(图文教程三十五)本节课主题:上一节课,docker镜像加速服务器搭建完成后,本节课需要配置域名,并使用nginx端口转发; 前言:一定要知道每一个命令是啥意思,并且要学会看报错信息,学会使用AI。1. 更新系…

【含文档+PPT+源码】基于GPT+SpringBoot的个人健康管理与咨询架构设计与建立

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …