在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
- idea2022.2.3安装破解
转:https://www.quanxiaoha.com/article/idea-pojie.html 1 注意事项 如果是卸载了旧版本安装的本版本,安装完成后打不开,可能是旧版本的影响 找到:C: ...
- Vue31 消息订阅和发布
1 简介 组件之间的通信除了使用事件总线之外,还可以使用一些插件来通过消息的订阅和发布来实现.pubsub-js就是一个不错的选择. 2 使用 2.1 安装 npm i pubsub-js # 或 y ...
- 国际财务系统基于ShardingSphere的数据分片和一主多从实践
作者:京东物流 张广治 1 背景 传统的将数据集中存储至单一数据节点的解决方案,在性能和可用性方面已经难于满足海量数据的场景,系统最大的瓶颈在于单个节点读写性能,许多的资源受到单机的限制,例如连接数. ...
- 基于ROS的串口底层写法
serial_device.cpp #include "serial_device.h" namespace roborts_sdk { SerialDevice::SerialD ...
- 字符串、函数、bug
字符串 字符串驻留机制 仅保存一份相同且不可变字符串的方法,不同的值别存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续穿件相同的字符串时,不会开辟新的空间,而是把字符串 ...
- Vue-cli混入、elementUI的使用、vue-router、Vuex
目录 混入.elementUI的使用.vue-router.Vuex 一.Vue项目改成比较纯净的状态及props其他使用 1.Vue项目改成纯净的项目 2.props的其他使用 二.混入(mixin ...
- Invade the Mars
题目 网上大把 分析 显然不能简单直接最短路 城市被攻占的特点是:保护的城市都被攻占了 那么这个城市被攻占的最早时间必然是所有保护他的城市中最大的被攻占时间 于是我们可以 设 \(dis\) 表示军队 ...
- K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群
开篇 <K3s 系列文章> <Rancher 系列文章> 方案 在腾讯云上安装 K3S 后续会在这套 K3S 集群上安装 Rancher 方案目标 高可用 3 台master ...
- SnakeYaml的不出网反序列化利用分析
SnakeYaml的常见出网利用方式: !!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[ !!java.net.URL ...