返回主页码农译站欢迎关注我的公众号——码农译站,一手更新
博客园首页新随笔联系订阅管理随笔 - 14 文章 - 0 评论 - 72
改进你的c#代码的5个技巧(二)
在本文中,我将向你展示c#编程的5个最佳实践。我从日常编程经验中学到了这些实践。我在release模式下测试了所有的代码,并在开发环境稳定后进行了截屏。我想你会喜欢这些建议的。
在使用数据类型之前选择它
对于许多类型,我们宁愿不决定在日常编程生活中使用什么数据类型。就在几个月前,我也是其中之一。但是当我开始学习编程中的最佳实践以提高代码性能时,我了解到了错误的数据类型是如何影响代码的。我将展示一个演示来证明这个概念。
复制代码
static void Main(string[] args)
{
List li = new List();
Stopwatch sw =new Stopwatch();
sw.Start();
for (int i = 0; i < 10000; i++)
{
li.Add(i);
}
sw.Stop();
Console.Write(“Using Arraylist(Object)” + sw.ElapsedTicks + “\n”);
sw.Reset();
sw.Start();
Int32[] a = new Int32[10000];
for (int i = 0; i < 10000; i++)
{
a[i] = i;
}
sw.Stop();
Console.Write(“Using Value(Integer Array)” + sw.ElapsedTicks);
Console.ReadLine();
}
复制代码
点击并拖拽以移动
在上面的代码中,首先我使用了一个list来存储1000个整数值,在第二次执行相同的操作时,我使用了一个整数数组。我的输出截图显示了哪种存储机制最适合整数数组。现在,你可能会想为什么这个list要花更多的时间呢?原因是,list以对象格式存储数据,当我们首先尝试存储值类型时,它将其转换为引用类型,然后再存储。因此,第一点是始终选择适当的存储机制以获得最佳性能。
使用for循环代替foreach
我现在要解释一个非常有趣的事实。我想你们都熟悉for和foreach循环。现在如果我问你哪个更快?嗯…不知道。对吧?
伙计们,for循环比foreach循环快得多。让我们看看下面的例子。
复制代码
List Count = new List();
List lst1 = new List();
List lst2 = new List();
for (int i = 0; i < 10000; i++)
{
Count.Add(i);
}
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Count.Count; i++)
{
lst1.Add(i);
}
sw.Stop();
Console.Write("For Loop :- " + sw.ElapsedTicks + “\n”);
sw.Restart();
foreach (int a in Count)
{
lst2.Add(a);
}
sw.Stop();
Console.Write("Foreach Loop:- " + sw.ElapsedTicks);
Console.ReadLine();
复制代码
不要担心,我已经在发布模式下测试了这个示例,这个屏幕截图是在几次测试运行后拍摄的。
选择何时使用类,何时使用结构体
接受这样一个事实,即基本理解了c#中的结构体和类,或者至少理解了最喜欢的编程语言中的结构体和类(如果它们存在的话)。好吧,如果你在想“很久以前我学过结构体,但在日常编码生活中从未使用过它”,那么你就是那95%从未测量过类和结构体性能的开发人员中的一员。别担心;在写这篇文章之前,我也没有。
那么类呢?是的,我们时不时地在日常项目开发中实现一个类。
现在我的问题是“哪个更快,类还是结构体”?我猜你会想“从未测试过”。好的,我们来测试一下。看看下面的代码。
复制代码
namespace BlogProject
{
struct MyStructure
{
public string Name;
public string Surname;
}
class MyClass
{
public string Name;
public string Surname;
}
class Program
{
static void Main(string[] args)
{
MyStructure[] objStruct = new MyStructure[1000];
MyClass[] objClass = new MyClass[1000];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
objStruct[i] = newMyStructure();
objStruct[i].Name = "Sourav";
objStruct[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Structure:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
objClass[i] = newMyClass();
objClass[i].Name = "Sourav";
objClass[i].Surname = "Kayal";
}
sw.Stop();
Console.WriteLine("For Class:- " + sw.ElapsedTicks);
Console.ReadLine();
}
}
}
复制代码
输出结果如下:
现在很明显,结构体要比类快得多。同样,我在发布模式下测试了这段代码,并获得了至少20个输出,以使程序达到稳定的位置。
现在最大的问题是“为什么结构体比类快?”
正如我们所知,结构体变量是值类型,值(或结构体变量)存储在一个位置。
类对象是引用类型。如果是对象类型,则创建引用,并将值存储在内存的其他位置。基本上,值存储在一个可管理的堆中,指针创建在堆栈中。以这种方式在内存中实现一个对象,通常要比结构体变量花费更多的时间。
始终使用Stringbuilder进行字符串连接操作
这一点对开发人员来说非常关键。在进行大量字符串拼接操作时,请使用StringBuilder代替String。为了演示它对代码性能的影响,我准备了以下示例代码。我在for循环中执行了500次字符串拼接操作。
复制代码
public classTest
{
public static string Name { get; set; }
public static string surname;
}
class Program
{
static void Main(string[] args)
{
string First = “A”;
StringBuilder sb = new StringBuilder(“A”);
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 500; i++)
{
First = First + "A";
}
st.Stop();
Console.WriteLine("Using String :-" + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 500; i++)
{
sb.Append("A");
}
st.Stop();
Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);
Console.ReadLine();
}
}
复制代码
这是输出:
选择分配类数据成员的最佳方式
在为类变量赋值之前,我建议你现在查看以下代码和输出屏幕。
复制代码
namespace Test
{
public class Test
{
public staticstring Name { get; set; }
public staticString surname;
}
class Program
{
static void Main(string[] args)
{
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 100; i++)
{
Test.Name = "Value";
}
st.Stop();
Console.WriteLine("Using Property: " + st.ElapsedTicks);
st.Restart();
for (int i = 0; i < 100; i++)
{
Test.surname = "Value";
}
st.Stop();
Console.WriteLine("Direct Assign: " + st.ElapsedTicks);
Console.ReadLine();
}
}
}
复制代码
是的,我们的输出屏幕是说,使用属性分配数据成员比直接分配要慢得多。
欢迎关注我的公众号,如果你有喜欢的外文技术文章,可以通过公众号留言推荐给我。
点击并拖拽以移动
原文链接:https://www.c-sharpcorner.com/UploadFile/dacca2/5-tips-to-improve-performance-of-C-Sharp-code/
好文要顶 关注我 收藏该文
码农译站
关注 - 2
粉丝 - 17
+加关注
00
« 上一篇: 在大型软件项目中如何处理错误和异常
posted @ 2021-01-06 08:40 码农译站 阅读(114) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】AWS携手博客园为开发者送福利,注册立享12个月免费套餐
【推荐】七牛云新老用户同享 1 分钱抢 CDN 1TB流量大礼包!
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻
相关博文:
· ArrayList实现原理(JDK1.8)
· 十分钟掌握Pandas(上)——来自官网API
· Java并发之synchronized关键字和Lock接口
· Aso.NetCore的配置系统Configuration
· kalilinux修改更新源和更新命令
» 更多推荐…
关注我的公众号,精彩文章抢先看!
昵称: 码农译站
园龄: 27天
粉丝: 17
关注: 2
+加关注
< 2021年1月 >
日 一 二 三 四 五 六
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6
随笔档案
2021年1月(3)
2020年12月(11)
最新评论
- Re:改进你的c#代码的5个技巧(一)
@适可而止、 这个不是傻不傻得问题,是业务需要得问题,就比如:现在有个业务,就是要求把数据库得一批数据转到另外一张表,里面的数据都时没关联的,要求时尽量多地把数据导成功,其中一些因为旧数据问题转换时会…
–Jedrek - Re:改进你的c#代码的5个技巧(一)
@xiaoxiaotank 对的,所有事情都是得看业务…
–Jedrek - Re:改进你的c#代码的5个技巧(一)
@码农译站 嗯嗯,所以说“永远不要在循环中实现try-Catch”这个就太绝对了,只有在没影响业务需求的情况下才尽量不用,只能根据需求来…
–Jedrek - Re:改进你的c#代码的5个技巧(一)
强烈建议新人千万不要看这篇文章!!! 1.异常也是可以分为业务异常的,对于用户输入校验来说,返回异常没什么问题!什么?异常消耗太大?那你外部想要得知具体的错误信息,你咋返回?修改方法返回类型为字符串?…
–xiaoxiaotank - Re:改进你的c#代码的5个技巧(一)
@Jedrek 谁那么傻 会在循环里面 加try catch…
–适可而止、
阅读排行榜 - .NET 5 源代码生成器——MediatR——CQRS(3150)
- 改进你的c#代码的5个技巧(一)(2840)
- 向Docker告别的时候到了(799)
- C#中的深度学习(四):使用Keras.NET识别硬币(666)
- C#中的深度学习(三):理解神经网络结构(562)
评论排行榜 - .NET 5 源代码生成器——MediatR——CQRS(32)
- 改进你的c#代码的5个技巧(一)(26)
- 在 ASP.NET Core和Worker Service中使用Quartz.Net(4)
- C#中的依赖注入和IoC容器(4)
- C#中的深度学习(三):理解神经网络结构(2)
推荐排行榜 - .NET 5 源代码生成器——MediatR——CQRS(15)
- 改进你的c#代码的5个技巧(一)(8)
- C#中的依赖注入和IoC容器(5)
- 在 ASP.NET Core和Worker Service中使用Quartz.Net(4)
- 向Docker告别的时候到了(3)
Copyright © 2021 码农译站
Powered by .NET 5.0 on Kubernetes