改进你的c#代码的5个技巧(四)
像每一篇文章一样,我会重复几行。我在我的Core i3 CPU、4GB主内存和Windows 7平台上测试了以下代码。如果你在不同的硬件配置或使用不同的平台,那么你的输出可能会随着我的输出屏幕而变化,并且输出可能会根据当前运行的进程而变化。由于所有的点都是性能测试,我已经在发布模式下对它们进行了测试,并在一个稳定的情况下对所有代码进行了截图。让我们从第一条建议开始。
如何检查代码中的空字符串?
在这一点上,我将向你展示三种空或空字符串检查样式。我希望你熟悉所有的风格,但可能不熟悉他们的表现。让我们从一个小例子开始。下面有三个函数(是的,都是静态的)。我很懒,不想再次创建对象)。在第一种样式中,我使用Length属性。在第二种情况下,我使用一个空格或空字符串(" ")。在第三种情况下,我使用string类的空属性。下面是我的测试代码。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Test1
{
public class Compare
{
public static void First(string Value)
{
if (Value.Length != 0)
{
}
}
public static void Second(string Value)
{
if (Value != "")
{
}
}
public static void Third(string Value)
{
if (Value != string.Empty )
{
}
}
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Compare.First("Sourav");
sw.Stop();
Console.WriteLine("Using Length: "+sw.ElapsedTicks);
sw.Restart();
Compare.Second("Sourav");
sw.Stop();
Console.WriteLine("Using != " +sw.ElapsedTicks);
sw.Restart();
Compare.Third("Sourav");
sw.Stop();
Console.WriteLine("Using Empty: " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
输出结果如下:
我们可以看到长度测量风格(第一种)花费的时间最多。字符串空样式是耗时最少的过程。
所以,最后一句是"使用String.Empty检查字符串是否为空”。
更改你的类型转换风格
是的,如果你没有实现正确的类型转换技术,请更改它。下面我将展示两种传统的类型转换风格及其对代码性能的影响。第一种风格(也是最糟糕的一种)非常简单,使用大多数开发人员都使用的圆括号()。第二种风格是通过as关键字。在下面的代码中,我实现了这两个功能。让我们来看看下面的代码。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Test1
{
public class Base
{
}
public class Derive : Base
{
}
class Program
{
static void Main(string[] args)
{
Derive d = new Derive();
Stopwatch sw = new Stopwatch();
sw.Start();
Base b =(Base) d;
sw.Stop();
Console.WriteLine("Using type cust : "+ sw.ElapsedTicks);
sw.Restart();
Base c = d as Base;
sw.Stop();
Console.WriteLine("Using as keyword : "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
下面是输出内容:
嗯. .我们流行的最差技术比as关键字慢6倍。现在,在这一点上,我不会写结论,如何转换对象是你的选择。
高字符串比较法
是的,关于字符串的另一个技巧。我们知道有两种常用的字符串比较方法。一个是“操作符==”,另一个是使用String类的Equals()方法。
有一天我问我的一个同事:“你最喜欢哪一个?”他回答了第一个(换句话说,==)。我问他为什么?他回答说:“它非常简单,容易,从我第一次学习c#开始,我就一直在使用它,我对它很满意,我不会改变我的风格。”嗯,如果你也处于这种情况,那么我建议你先看看输出屏幕,然后再看看代码。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Test1
{
public class Test
{
public static void First(String Value)
{
for (int i = 0; i < 100; i++)
{
if (Value == "Sourav")
{
continue;
}
}
}
public static void Second(String Value)
{
for (int i = 0; i < 100; i++)
{
if (Value.Equals("Sourav"))
{
continue;
}
}
}
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Test.First("Sourav");
sw.Stop();
Console.WriteLine("Using == : "+ sw.ElapsedTicks);
sw.Restart();
Test.Second("Sourav");
sw.Stop();
Console.WriteLine("Using Equals : "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
你有一个附带快速计算的计算器。屏幕显示,使用"=="样式比字符串比较函数(Equals())慢190倍。我不会写结论。这是你的责任,改变你的风格,并分享上面的图像(输出屏幕)给你的朋友。
用一个小技巧刺穿循环
在开始之前,我想告诉你一件事。这不是很重要的一点。否则这将是一个非常重要的适应技巧。这里,我将展示如何实现传统的for循环。如果你遍历下面的代码,那么会发现在第二个“for”实现中,局部变量使用的时间更少,这就是为什么消耗的时间更少,但并不是非常少。因此,最好的做法是减少变量的使用次数。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Test1
{
public class Base
{
public static void First(Int32 limit)
{
for (int i = 0; ++i <= limit; )
{
}
}
public static void Second(Int32 limit)
{
for (int i = limit; -- i >= 0; )
{
}
}
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Base.First(100);
sw.Stop();
Console.WriteLine("First "+ sw.ElapsedTicks);
sw.Restart();
Base.Second(100);
sw.Stop();
Console.WriteLine("Second : "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
下面是输出内容:
让我们写一行结论:“在编写循环迭代代码时要聪明。”
继承是一种很好的实践,但并不总是如此
我们知道OOP的一个漂亮特性是继承,它减少了代码冗余,改进了代码维护等等。我并不否认这些,但我的第五点是反对到处不必要地设立小类。如果真的不需要,那么就不要创建类层次结构。看看下面的代码。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace Test1
{
public class Base
{
}
public class Derive :Base
{
public string name;
}
public class Concrete
{
public string name;
}
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Derive d = new Derive();
d.name = "Sourav";
sw.Stop();
Console.WriteLine("Derive style : "+ sw.ElapsedTicks);
sw.Restart();
Concrete c = new Concrete();
c.name = "Sourav";
sw.Stop();
Console.WriteLine("Concrete class : "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
首先,我创建了两个小类,在它们之间我根本没有使用第一个类。它作为基类服务。在第二个场景中,我创建了一个具体的类;它没有继承的概念。在main()方法中,我创建了它们的一个对象。让我们看看输出屏幕。
正如输出屏幕所示,在具体类中创建对象要比在派生类中快得多。让我们以一行注释结束“如果不需要,不要实现类层次结构”。
结论
亲爱的读者,感谢你花费宝贵的时间完成这篇文章。(因为大多数读者不会从头读到尾,如果你读了,那是我的个人成就)。欢迎大家提出各种意见。
欢迎关注我的公众号,如果你有喜欢的外文技术文章,可以通过公众号留言推荐给我。
原文链接:https://www.c-sharpcorner.com/UploadFile/dacca2/5-tips-to-improve-performance-of-C-Sharp-code-part-3/
改进你的c#代码的5个技巧(四)的更多相关文章
- 改进你的c#代码的5个技巧(三)
本文完全独立于前两篇文章.如果你喜欢它们,我希望你也会喜欢这个.在上一篇文章中,我展示了哪种方法更快,并比较了代码的执行速度.在本文中,我将展示不同代码片段的内存消耗情况.为了显示内存映射和分配图,我 ...
- 改进你的c#代码的5个技巧(一)
亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践. 你是否在用户输入验证中使用异常处理机制? 如果是,那么你就是那个把你的项目执行速度降低了62倍的人.你不相信我吗?等几分钟;我来教你怎么做. ...
- 改进你的c#代码的5个技巧(二)
在本文中,我将向你展示c#编程的5个最佳实践.我从日常编程经验中学到了这些实践.我在release模式下测试了所有的代码,并在开发环境稳定后进行了截屏.我想你会喜欢这些建议的. 在使用数据类型之前选择 ...
- 以事实驳斥:改进你的c#代码的5个技巧(四)
测试使用的环境:vs2019+.net core3.1 原文地址:https://www.cnblogs.com/hhhnicvscs/p/14296715.html 反驳第一条:如何检查代码中的空字 ...
- Java 性能优化手册 — 提高 Java 代码性能的各种技巧
转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...
- PHP代码20个实用技巧(转)
这些技巧特别是封装的,相对路径的还是挺好的,本身来自微信公众号,但是我担心以后删除,所以在我的博客上备份一下(微信公众号为:菜鸟教程) 在这篇文章中我们将看看一些关于PHP开发有用的提示和技巧,可以用 ...
- php代码20个实用技巧 ------ 转发自菜鸟教程
1.不要实用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点:它首先查找指定的php包含路径,然后查找当前目录,因此会检查过 ...
- 写Java代码的一些小技巧
写Java代码有三年多了,遇到过很多坑,也有一些小小的心得.特地分享出来供各位学习交流.这些技巧主要涉及谷歌Guava工具类的使用.Java 8新特性的使用.DSL风格开发.代码封装等技巧. 一.nu ...
- JavaScript是如何工作的02:深入V8引擎&编写优化代码的5个技巧
概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现J ...
随机推荐
- uni-app全局属性和方法
全局变量和全局方法是软件开发中常用的技术点! 实现方式大致分为: 1.vuex实现,值变动灵活 2.建立js文件,页面内引用 3.挂载vue实例后使用 4.小程序中的globalData 5.本地存储 ...
- PHP文件上传、错误处理
说明 这篇是针对之前php知识的补充内容 目录 说明 1. PHP目录处理函数 2. PHP文件权限设置 3. PHP文件路径函数 4. PHP实现文件留言本 5.PHP文件上传 1. php文件上传 ...
- 学好Spark/Kafka必须要掌握的Scala技术点(一)变量、表达式、循环、Option、方法和函数,数组、映射、元组、集合
前言 Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作.正如之前所介绍,Spark是用Scala语言编写的,Kafka server端 ...
- Day9 python高级特性-- 列表生成式 List Comprehensions
Python内置的非常简单却强大的可以用来创建list的生成式. 私理解为,就是for循环出来的结果搞成个list~~~~ 要生成顺序增量list可以使用list(range(x,y))来 ...
- AWT01-体系概述
1.概述 AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具. ...
- Elements-of-Python_04_Function
(内容包括函数.递归.Lambda.作用域等) 1. 函数 1.1 函数概述 函数是对程序逻辑进行结构化和过程化的一种编程方法,用于封装一个特定的功能,表示一个功能或者行为.函数是可以重复执行的语句块 ...
- Graphql Tutorials(Episode 01)
1.前言 最近认识到Graphql,它是一个基于DSL的api.我曾接触过一个pos机刷卡系统,它是基于JSON-DSL语言开发的框架,很有趣.可是后来,没有机会深入研究.直到最近我认识了Graphq ...
- 在Linux下下载RPM包
在Linux下下载RPM包,但是不安装 在工作中经常会遇到离线安装RPM包的情况,下面是下载RPM包的方法 # 使用yum下载RPM包 yum -y install --downloadonly &l ...
- fMRI数据分析学习笔记——常用工具
背景 在学习fMRI数据处理的过程中,通过其他的资料看到了别人推荐的有用的fMRI数据处理软件和小插件,在此记录一下,以便后期慢慢学习使用. 1.NeuroImaging Analysis Kit ( ...
- Centos7路由设置
再添加路由时,很多时候都是采用命令行用route添加的.但是在机器重启后.就失效了.这里也是参考了几位博主的经验 作出以下记载 一:路由表常用设置 1.route命令路由表常用设置: //添加到主机的 ...