数据结构C#描述(第五讲:在.NET中如何用一个常用计时程序来评判一段代码的时间复杂度)

C# 集合与数据结构:深入理解与应用 C# 提供了丰富的数据结构和集合类型,每种集合类型都有其独特的优势和适用场景。开发者应根据实际需求选择合适的集合类型,以提升程序的性能和可维护性。理解每种集合的操作时间复杂度和内存占用,能够帮助我们做出更智能的设计决策。掌握这些基本的数据结构,并了解它们的内在工作机制,是成为高效 C# 开发者的重要一步。 阅读详情

    以往我们在学习数据结构的过程中,常常在开篇就涉及到算法时间复杂度的概念。而时间复杂度也是评价一个算法好坏的最主要的指标。在.NET中,我们尝试避开繁琐的时间复杂度分析,取而代之的是使用一种简单的基准计时代码来测试判断某段代码从开始运行到运行结束所需要的时间。这种基准计时代码主要用来衡量一格算法或者代码从开始运行到完全结束所经历的时间。为了能够准确分析代码的时间性能,我们必须基于.NET环境中的特点充分考虑各方面因素。

 

   我们先用一种简单的方法来测试代码运行的时间:

   这段代码看上去,我们已经计算出了一个DisplayNums方法执行的时间。可是这是不准确的,因为我们忽略了.NET环境下代码的特殊性。首先,上面的代码所计算的时间是“从方法开始调用到返回主函数这一过程的时间”,在这一时刻,不仅仅是这段程序的进程在运行,还有别的很多进程,别的进程运行所占用的时间其实也附加到了我们的时间结果上,所以这里计算的时间实际上是不准确的。此外,这段代码忽略了.NET的一个非常重要的特性,那就是GC。在像.NET这样的一个运行时环境中,系统会随时因为垃圾回收而暂停下来,进行资源的释放。所以,上面代码的执行速度也会因为GC的调用而受到影响。

    为了减小以上两个因素带来影响,我们可以采取以下两种措施来一一克服:

    针对GC:我们应该确认在执行时间测试代码的时候没有GC在运行,最好的方法就是在开始测试时间之前,显式地调用GC,.NET为我们提供了一个特殊的对象-----GC,可以通过GC.Collect()方法来让系统进行垃圾回收。这还没有完,此外,存储在堆上的对象都有一个特殊的方法叫做finalizer(),这个方法是在删除一个对象时最后执行的一个方法,确认一个对象是否被完全删除实质上就是确认它的finalizer()方法是否已经执行,所以可以通过下面的代码来告诉程序先不要执行,只要等待,直到堆上多有的对象都完全删除干净。代码是GC.WaitForPendingFinalizers();

     针对Process:我们都知道,程序是在一个进程中运行的。而.NET引入了应用程序域的概念,这就使操作系统允许多个不同的程序在同一时刻在同一个进程上运行,只是他们使用进程中不同的应用程序域罢了。在一个进程中,一个程序,或者程序的一部分是在一个线程中运行的,所以线程和应用程序域是一一对应的。操作系统是通过线程来给一个程序分配执行时间的。当我们测试一段程序代码的运行时间的时候,自然希望只测试进程中分配给我们的被测程序的那一段代码,而不是把进程中其他任务的代码时间也一并测了。确切地说,我们所要关注的是程序运行的那个线程的时间,而不是整个进程的时间。值得庆幸的是,我们能够通过.NET System.Diagnostic命名空间提供的Process类来实现这一点。Process类有一些方法,可以让我们准确地定位每一个程序所运行线程的时间,代码如下:

 

综上所述,接下来我们就可以创建一个自己的Timing Class,来为以后测试任何程序代码的执行时间服务:

一个Timing Class 需要两个字段:

StartingTime---存储程序代码开始执行的时间

Duration----存储程序代码执行的时间片断

这两个数据变量都是TimeSpan类型的数据

我们需要在创建新的Time对象之前处理GC,所以要在构造函数中把对GC的处理添加进去。

代码如下:

.NET/C# 面试宝典:软件工程师必备知识与经验 一个典型的.NET/C#面试流程通常包括以下几个环节:筛选简历:公司HR或者招聘人员会根据简历中罗列的技术栈和项目经验,进行初步筛选。电话/视频面试:初步沟通技术背景,了解求职者的沟通能力。现场/线上技术面试:与技术团队进行面对面或在线实时的深度技术交流。技术测试/编码测试:现场或线上完成一些编程题目,展示你的编码能力和技术深度。领导/管理层面试:与未来的直接领导或公司高层进行沟通,了解工作期望和个人价值观。反馈与决定。 阅读详情

相关推荐

C#数据结构与算法实战精讲(推荐)

数据结构是程序设计的核心骨架,决定了数据的组织、存储与操作效率。在C#这一面向对象且运行于CLR托管环境的语言中,数据结构既继承了传统算法理论的通用性,又深度融合了类型安全、垃圾回收与泛型机制等现代特性。从逻辑结构看,C#中的数据结构可分为线性结构(如数组、链表、栈、队列)与非线性结构(如树、图、哈希表);按存储方式则分为顺序存储(如数组)与链式存储(如LinkedList理解这些结构的本质差异及其在.NET运行时的行为特征,是构建高性能应用的基础前提。在前一小节中已定义类,接下来构建容器类。

weixin_42323064的博客 1012

.NET中各种集合的数据类型与时间复杂度

转载于:https://www.cnblogs.com/lwzz/archive/2013/05/20/3089155.html

weixin_34112030的博客 189

C#代码 NET复杂度检查工具

C#代码 NET复杂度检查工具,可以检查出C#的语法,哪些未用变量等。

C#计时器的三种实现方法

在.NET中有三种计时器: 一、 System.Windows.Forms命名空间下的Timer控件,和所在的Form属于同一个线程。Timer控件只有绑定了Tick事件和设置Enabled属性为True之后才会自动计时,Stop()方法,Start()方法启动计时器重新计时; MyTimer.Enabled = true;  //启动计时器 MyTimer.Interval = 1000;

u013658041的博客 5万+

基于开源项目构建 CFS(网络靶场实战演练)平台

摘要:构建CFS网络靶场可使用多个开源组件组合,包括EVE-NG/GNS3或ContainerLab构建网络环境,Kasm提供工作空间,CALDERA+Atomic Red Team实现攻击模拟,DetectionLab建立防御环境,Malcolm/Arkime进行流量监控,CyRIS提供编排框架,Vulhub/DVWA创建漏洞靶标。关键在于通过API深度集成各组件,同时需注重安全隔离、资源规划及维护成本。建议开发统一管理平台,结合Ansible/Terraform实现自动化部署,打造定制化实战演练环境。(

深山技术宅的博客 1843

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

C#算法的时间复杂度和空间复杂度

C#算法的时间复杂度和空间复杂度简述时间复杂度空间复杂度 简述 通常不同的算法虽然结果一样但是消耗资源和时间却会有很大差别,衡量不同算法之间的优劣就要用到时间复杂度和空间复杂度 时间复杂度 时间指运行算法所需要的时间,那我们运行用C# Stopwatch看一下运行时间不得了,但是这个性能好的电脑和性能不好的电脑时间肯定是不同的。所以有了大O符号表示法T(n)=O(f(n)) for (int i ...

我的博客 2965

别再手动调参了!用MATLAB+改进PSO算法,5步搞定机械臂轨迹优化(附完整代码)

本文介绍如何利用MATLAB和改进PSO算法快速优化机械臂轨迹规划,仅需5步即可完成传统耗时的手动调参过程。通过混沌初始化、自适应权重等创新方法,改进PSO算法显著提升优化效率,实现全局最优解搜索,适用于工业自动化中的机械臂控制。文章包含完整MATLAB代码实现,帮助工程师轻松应用于实际生产场景。

weixin_29232121的博客 354

【愚公系列】2023年02月 .NET/C#知识点-程序运行计时的总结

在分析一个程序算法时间复杂度时,可以使用统计程序或程序片段的计算时间有助于理解程序性质,许多语言或系统都提供了内部计时功能。StopwatchStopwatch 一般用来测量代码运行消耗时间,以便获取更多代码运行性能上的数据。运行前先要调用 Start 函数来开始计时,结束时需要用到 Stop 函数停止计时,中间则可以插入需要监测的代码。如果有需要也还可以通过 Reset 或者 Restart 函数来重置计时器再开始下一次计时。

愚公智库 9066

HMC7044芯片模拟SPI配置

摘要: HMC7044是一款高性能双环路整数N分频抖动衰减器,支持SPI接口配置,适用于高速数据转换器时钟系统。该芯片采用双PLL级联架构,具有14路可配置输出,可满足GSM/LTE基站设计需求。SPI接口采用3线模式(SLEN/SCLK/SDATA),支持24位寄存器读写(13位地址+8位数据)。驱动实现基于Zynq EMIO模拟SPI,提供初始化、数据传输及寄存器配置功能,支持三线制工作模式和多种时钟参数设置。

toonyhe的博客 1095

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6952

常用数据结构的时间复杂度

一篇非常优秀的数据结构博客

stardhb的专栏 9399

抖音直播“卡黑屏”技术解析:从实现原理到平台风控与合规运营

在直播技术领域,视频流推送与实时互动是核心基础。其原理在于通过编码软件(如OBS)将音视频数据封装后,经由网络协议推送到服务器,再分发给观众。这项技术的价值在于支撑了实时、高并发的在线互动场景,是直播、在线会议等应用的基石。然而,在追求流量和互动的实践中,衍生出一些非常规操作,例如通过技术手段中断或控制视频流推送,仅保留音频和互动功能,以达到特定运营目的。这便涉及到了**卡黑屏**这一具体现象。它本质上是对直播流的人为干预,常与**流量博弈**和**风险规避**等动机相关联。从工程实践角度看,实现方式多样,

weixin_29895109的博客 1296

常用的数据结构_几种常用数据结构的时间复杂度

前言数据结构应该是和日常的业务代码密切不可分的,每个人都应该接触过,但是真正去了解或研究的人很少,今天就给大家介绍和对比一下常用数据结构.时间复杂度对比Data StructureAddFindDeleteGetByIndexArray (T[])O(n)O(n)O(n)O(1)Linked list (LinkedList)O(1)O(n)O(n)O(n)Resizable...

weixin_39593519的博客 1617

嵌入式系统开发笔记112:通过有人云测试MQTT

项目中使用到“有人”公司的WH-LTE-7S0模块,本文讲解通过有人云进行MQTT测试的方法。

snmplink的博客 997

国科大学习资料--矩阵论(叶世伟)-期末考试题整理3

国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3

无名何许人的博客 1403

c#计算一段代码的时间复杂度

用.net内置类监控程序的运行时间,代码如下: 1 public class Timing 2 { 3 TimeSpan duration; 4 public Timing() //和那个计时类还一样,想要弄明白 先要弄明白 进程 线程 挂起 三个名词 5 { 6 durati...

diandi7050的博客 303

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C#数据结构学习大纲

通过这一系列的学习内容,将能够从基础的数组、链表、栈和队列,到更为复杂的图、树、哈希表等高效的数据结构,不仅在工作中解决实际问题,还能为日后的算法面试、系统设计、软件优化打下坚实的基础。通过学习这个大纲,将能够从基础到进阶掌握C#中的数据结构,进而在工作中解决实际问题,提高编程能力。

小宝哥Code的专栏 1309

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

常用数据结构及复杂度

常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) O(1) L...

aijianxie8808的博客 1312

常用数据结构[转]

原文:http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find Delete GetByIndex Array (T[]) O(n) O(n) O(n) ...

weixin_34380948的博客 326

推荐文章:高性能的.NET计时器——HashedWheelTimer

推荐文章:高性能的.NET计时器——HashedWheelTimer 在高并发、低延迟的现代应用中,时间管理变得尤为重要。特别是对于那些需要处理大量I/O操作和精确控制超时逻辑的应用而言,一个高效且可扩展的定时器解决方案至关重要。今天,我们要向您介绍的是HashedWheelTimer,一个专为.NET平台设计的高性能定时器库,它基于George Varghese和Tony Lauck的经典论文实...

gitblog_00068的博客 823

c纳秒级计时器_一个好用的,高效的,精确的纳秒级C#计时器

我们在平时的项目中,时常会遇到这样的问题,当我们要评价一个算法的好坏时(这里指的是时间复杂度量级相同的两个算法);当我们要测试一段代码的性能时。。。我们都需要一个高精度的时间。如何来得到一个高精度的时间,而且又不影响我们的测试准确性呢?平时大家可能采用的方法是:new两个time,然后两个Time相减,得到一个TimeSpan,这样就可以得到一个毫秒级的时间(当然了,这个是一个并不精确的毫秒级时间...

weixin_39864373的博客 258
上一篇: DOS命令查看进程内存
下一篇: 委托的用法
Zevin
博客等级 码龄17年 63粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值