在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. ...
随机推荐
- 剑指 Offer 34. 二叉树中和为某一值的路径(java解题)
目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 1. 题目 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总 ...
- python爬虫学习——文件操作,异常处理
文件操作 ''' f = open("a.txt","w") #打开一个文件, w模式(写),如果文件不存在就在当前目录下创建 f.write("he ...
- 滴水 1.c++类 this指针 笔记+指针
1.结构体带参数传递 将结构体的数据压入堆栈中 然后进入函数内进行处理 2.结构体指针传递 将this指针压入进去 来查找 a b数据 3.函数可以放在结构体里面,也可以放在结构体外面 放入进去后 但 ...
- Python自动合并Word文件同时添加分页符的方法
本文介绍基于Python,实现对多个Word文档加以自动合并,并在每次合并时按要求增添一个分页符的方法. 现有多个Word文档文件,需将其按名称顺序合并为一个新的Word文件,且需保证每一次合 ...
- 【KAWAKO】audiotsm-使用python对音频进行变速不变调处理
目录 安装库 导入相关库 定义reader 定义writer 定义WSLOA算法,并运行 官方手册 源码 安装库 pip install audiotsm 导入相关库 import audiotsm ...
- JZOJ 2022.02.26【提高A组】模拟
比赛总结 考场 \(T1,T2\) 思想切了 然而... \(\text{T1}\) 飞行棋 当然要 \(dp\),然而发现后六格有后效性 姑且设 \(f_i\) 表示从第 \(i\) 格到终点的期望 ...
- 「SHOI2015」脑洞治疗仪
\(\text{Naive Solition}\) 当然是 \(ODT\) 暴力啦 \(Luogu\) 煞费苦心加强了数据,于是就过不了了... 不过 \(LibreOJ\) 上可以过 #includ ...
- 题解 P4448
如果这不是一道原题,这道题出的还不错,是个比较毒瘤的数数.由于我太菜了反正我自己没有做出来后面的 dp,zyf 巨佬教的. 不过听说合肥六中某巨佬当年也没做出来,平衡了雾 但问题是这道题是原题,我安徽 ...
- GPIO 和中断控制 LED 的状态
中断的概念 中断是 MCU 强行从正常的主任务切换到由某些内部或外部条件的紧急任务.中断的优先程度远远高于主任务,MCU 会暂时把主任务挂起,转而处理中断任务,之后再执行主任务. 引起中断的外部条件来 ...
- PostGIS之空间关系
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...