在C#中Release与Debug的区别小案例
我们都听说过C#写的代码 Release通常会比Debug性能要好一点跑得快一些。
先普及一些相关基础知识:
(1)在CLR中将对sbyte、byte、short、ushort、int、uint、char、float 和 bool。以及引用类型保证读写时原子性的(long、double不是原子性读写)
变量中的所有字节都是一次性写入或读取的。 (2)Framework Class Library(FCL) 保证所有静态方法都是线程安全的。这意味着假如两个线程同时调用一个静态方法,不会有数据被损坏。为什么? public static string Print(String str)
{
string val = "";
val += str;
return val;
}
因为静态方法内声明的变量,每个线程调用时都会新创建一份,而不会共用一个存储单元。比如这里的val每个线程都会创建自己的一份,因此不会有线程安全问题。
注意:静态变量,由于是在类加载时占用一个存储区每个线程都是共用这个存储区的,所以如果在静态方法里使用了静态变量;这就会有线程安全问题。 (3)内存、CPU缓存(注:下列为简述内容,实际上不仅如此) CPU缓存,CPU集成的缓存。 内存,内存条硬件提供的存储空间。
下面看一个例子:
public class Program
{
public static int bookNum = 0; public static void Main(string[] args)
{
Console.WriteLine("juster书的数量:" + bookNum); Thread juster = new Thread(() =>
{
Console.WriteLine("juster没带书,等待家长送书到学校..."); while (bookNum == 0) {} Console.WriteLine("juster拿到书,开始上课听讲。");
});
juster.Name = nameof(juster);
juster.Start(); Thread parent = new Thread(() =>
{
Console.WriteLine("parent在屋里找书中..."); Thread.Sleep(2000); Console.WriteLine("parent找到了书之后,送往学校..."); SendBook();
});
parent.Name = nameof(parent);
parent.Start();
} public static void SendBook()
{
bookNum = 1;
}
}
Run起来 对比一下Release 和Debug的结果。
有意思的是不是出来了
核心就是Release会优化 把 while (bookNum == 0) 直接给优化成了 while (0== 0)
解决的办法 就是将
public static int bookNum = 0;
改成
public static volatile int bookNum = 0;
最后说下volatile
其他类型(包括 double 和 long)无法标记为 volatile,因为对这些类型的字段的读取和写入不能保证是原子的。若要保护对这些类型字段的多线程访问,请使用 Interlocked 类成员或使用 lock 语句保护访问权限。
1 volatile 关键字只能应用于 class 或 struct 的字段。不能将局部变量声明为 volatile
2 volatile并不能用来做线程同步,它的主要作用时为了让多个线程之间能看到被修改过后最新的值。(也就是说可以让线程之间有权力访问 逻辑上不保证对不对)
3 C#不支持以传递引用的方式将volatile字段传给方法。
int.TryParse("123", out x);
4 除了禁止编译优化,还有同步到内存中因为CPU每个核心都有自己Cache所以需要同步到内存中方便其他核心使用。
更详细的可以参考这篇文章 https://www.cnblogs.com/justzhuzhu/p/15550450.html
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/volatile?WT.mc_id=WDIT-MVP-5004326
在C#中Release与Debug的区别小案例的更多相关文章
- VS2010 release 和 debug 调试区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- VC中release和debug版本的区别
DEBUG版本 包含调试信息,编译器生成的代码方便调试 RELEASE版本 算是发布版本,RELEASE下不能调试,生成的文件更小,编译器生成的程序速度更快但是Debug下生成的exe文件在单独运行时 ...
- Release和Debug的区别
Debug与Release版本的区别 Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动.如果我们愿意,我们完全可以把Debug ...
- 编译为 Release 与 Debug 的区别
class Program { static void Main(string[] args) { DoWork(); } static void DoWork() { new Person().Ru ...
- release与debug的区别
http://www.cnblogs.com/JemBai/archive/2009/01/13/1374805.html
- python中循环引用导致内存泄漏小案例
首先定义一个Person类和一个Dog类,然后分别实例化对象p和d,给p对象添加一个pet属性 给d对象添加一个master属性此时Person和Dog的应用计数都为2,当del p 和del d后P ...
- C#输出到Release VS中Release模式下生成去掉生成pdb文件
Release 与 Debug 的区别就不多说了, 简单来说 Release 优化过, 性能高一些. Debug 为方便调试. 默认情况下是 Debug, 那如何改成 Release 呢? 项目上右键 ...
- C#中的release和debug模式
以下内容来源:https://www.cnblogs.com/rgjycs/p/9254332.html 在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包 ...
- vc6++Release和Debug
1. 如何快速地规范代码缩进格式 选中所需要规范的代码,按shift+F8 2. 如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框 ...
- maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository. ...
随机推荐
- Laravel 刚创建的项目 API 无法使用 Session,是没有在Api的请求内开启Session
- spring-in-action-初识反应式编程reactor
一:反应式编程 1.反应式编程的优点 1)无阻塞 2)处理的数据可以是无限的 打水仗: 命令式编程:使用的是水气球.水气球的容量有限.把水气球装水,再扔向对方.如果想要更多的水,就需要更多的水气球. ...
- visual studio(vs2017、vs2019)离线安装包下载、制作
一.下载安装引导程序(以vs-professional-2019为例) https://aka.ms/vs/16/release/vs_professional.exe 二.在引导程序目录打开cmd命 ...
- 时间轮TimeWheel工作原理解析
时间轮工作原理解析 一.时间轮介绍 1.时间轮的简单介绍 时间轮(TimeWheel)作为一种高效率的计时器实现方案,在1987年发表的论文Hashed and Hierarchical Timing ...
- 学习Java Day15
今天学习了自定义类
- qt元对象系统之 Q_OBJECT宏
宏展开是这样 #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QM ...
- 三:Mybatis
三.MyBatis 主流的ORM 支持java .NET Ruby三种语言,MyBatis是对JDBC的封装 ORM框架Hibernate 区别: 1)sql 优化方面 Hibernate 使用 HQ ...
- ENCOURAGE研究: 病情中度活动RA获得深度缓解后有望实现停药
标签: 类风湿关节炎; TNF拮抗剂; 维持期减停 病情中度活动的RA患者在获得深度缓解后有望实现停用生物制剂 电邮发布日期: 2016年2月3日 病情中度活动的类风湿关节炎(RA)患者通过传统DMA ...
- H5与原生APP调了交互方式
APP中不支持position:fixed; 改成 position:absolute; 触发H5按钮跳转APP原生页,进入调取APP的名传自己的方法 <a href="javascr ...
- Landsat数据在USGS中无法下载Surface Reflectance产品的解决方法
本文介绍在USGS官网下载Landsat遥感影像数据时,出现报错信息,无法下载地表反射率产品(Surface Reflectance)的解决办法. 最近,利用这篇文章批量下载Landsat遥感 ...