Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts


C++中的模版模版参数和模版别名的使用

最近在看候捷的C++系列视频教程,其中有一个例子讲到了使用迭代器特性(iterator_traits)和使用模版模版参数(template template parameter)以及模版别名(alias template)来完成同一件事情,非常的经典,我这里记录一下。 事情的起因 事情的缘由是要比较在不同类型的容器类型(vector、deque、set等等)中,对象是否有moveable的相关构造函数 对容器的各种操作性能的影响。所以要编写一个通用的模版方法,允许接受不同的模版参数,以及不同的数据类型,并能输出调用各种操作(拷贝构造,移动构造,赋值构造)耗费的时间等的时间。 为了方便进行,这里编写了两个简化版本的String类,一个名为MyString的类带有各种移动构造,拷贝,赋值函数(Big Five) #include #include # …

template template parameter alias template iterator traits

“异常”应该仅用于真正的异常情况而不应将其当作正常处理流程来使用

在《Writing High-Performance .NET Code》这本书中,作者指出,抛出“异常”(Exception)的开销十分高昂,很大一部分原因是.NET的异常对象中包含了丰富的信息,“异常”必须是为真正的异常情况服务,在这种情况下性能可以退居其次。 作者还举了例子,说明了三个事实: 抛出“异常”的方法比空方法慢了数千倍。 “异常”抛出的层数越深,速度就越慢。 和只用1个catch相比,多个catch语句的影响比较轻微,但仍然影响很明显。 使用catch捕获异常的开销可能不大,但是要访问Exception对象的StackTrace属性开销可能会非常高。因为需要由“异常”指针重建调用栈,并转译成可读文本。作者反复强调,“异常”应该仅用于真正的异常情况,如果将“异常”作为正常的处理流程来使用,会让程序毫无性能可言。 …

Exceptions

.NET中几种名字包含Dictionary的数据结构

在.NET Core的源代码中,除了常用的Dictionary、ConcurrentDictionary之外,还有几种名称包含Dictionary的数据结构,它们是ListDictionary、OrderedDictionary、SortedDictionary、HybirdDictionary和StringDictionary。这些个杂牌Dictionary用得很少,不看源代码可能还不知道😂。表面上看,好像都是Dictionary,但研究发现其内部实现却大不相同。 …

ListDictionary OrderedDictionary SortedDictionary HybridDictionary

.NET Core中Dictionary的实现

Dictionary是一种存储键值对的数据结构,可以根据Key快速查找对应的Value,它的内部实现原理其实很简单,在浅谈算法和数据结构: 十一 哈希表这篇文章中有详细介绍,但实际的原理和工程实现可能有所不同,在.NET中有.NET Framework和.NET Core的两个版本,大体相同,但细节上有所区别。这里以.NET Core中的Dictionary源码为例,来说明Dictionary的实现细节。 …

Hashtable Dictionary

多线程环境下使用HashSet抛出NullReferenceException异常的分析

在.NET中有普通集合类型比如Queue,Dictionary等,也有对应的并发集合比如ConcurrentQueue,ConcurrentDictionary,顾名思义,前者是非线安全的,如果要在多线程环境下使用,需要自己加锁,后者则是线程安全的。 线程安全是有代价的,那就是会影响效率。在有些时候下,应用场景很少写,但读很非常频繁,在允许“脏读”的情况下,是不是直接使用普通的集合类型就可以呢,答案是可以,但是需要非常慎重,否则可能会抛出异常。今天我就遇到了这个问题。 场景 有个类SymbolManager,在内部有一个HashSet,这个HashSet里保存了一系列代码,程序会在每天早上的9点重新加载本地文件里的代码到这个HashSet集合里,同时这个类对外提供了一个IsSymbol 方法,以判断某个代码是否在此HashSet中。 class SymbolManager …

HashSet

记一次.NET程序内存暴涨分析

大约在上个月,利用WinDbg找到了软件中的一个存在很久的内存会暴涨的bug,说起来也是巧合,这里记录一下。 在描述问题之前,我想提一下,软件开发中寻找bug的正确思路和方法,这也是从我领导那里学到的严谨态度,并且在工作中体会最深的。 …

WinDbg Memory Leak

如何科学的安装最新版本的WinDbg

最早版本的WinDBG分为32位和64位,界面也比较古老,在大概2016年,微软更新了一版UI,变得更现代化了,但似乎只能在Windows Store里面安装,名字也变味了WinDBG Preview,这一Preview就是5年,在今年的5月1日,终于微软把这个Preview给拿掉了。新版本同样需要在Windows Store里面安装,但名字似乎还叫WinDBG Preview,只支持在Windows 10及以上版本上安装。 如果按照通常的步骤,安装或者升级新版本的WinDBG是比较费劲的,很慢。     https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/windbg-overview https://learn.microsoft.com/en-us/windows-hardware/drivers/ …

WinDbg

C++中的前置后置式自增自减运算符

根据运算符在变量的前面还是后面,可以分为前置(prefix)运算符和后置(postfix)运算符。++i、--i就是前置运算符,i++、i--就是后置运算符。 前置i,++i是先将变量 i 的值加 1,然后再使用这个新值进行计算或赋值操作;后置i,i++则是先使用变量i的原始值进行计算或者赋值,然后再将i的值加1。 在C#中,前置式和后置式++或--,似乎除了语义上的区别之外,效率上没有区别,但在C++中则不一样,《Primer C++》和 《More Effective C++》中都说明,前置式自增自减(++i、--i)的效率比后置式(i++、i--) 通常更快,且至少不慢(prefix will sometimes be faster but never slower then postfix)。 …

prefix postfix overloading

Windows Server操作系统上安装Intel网卡驱动

重装系统对于一个码农来说是一项必备技能。大多数个人用户操作系统比如Windows 7~11,重装系统相对来说比较简单,网上有非常多的教程,装完之后操作系统里面自带的驱动能驱动大部分硬件。但对于Windows Server这种服务器操作系统来说,重装完可能会有点麻烦,特别是各种驱动,而且第三方驱动软件,比如驱动XX、精灵之类的又完全不支持Windows Server系统。这里就记录一下我在给服务器重装Windows Server系统遇到的网卡驱动问题以及对应的解决方法。 准备工作 在确定要对一台能运行或不能运行的机器重装系统之前,安装前的准备工作非常重要。 数据备份 首先就是资料的备份。在重装系统之前,最好把其中重要的资料拷贝出来,尤其是C盘里的资料,因为重装系统可能选错盘符或者引导区格式不对,会对C盘格式化从而导致C盘资料丢失,虽然现在安装Windows 10~11操作系统,在不格 …

Windows Server 2019 Intel I219V driver

Python注册和调用C#中的事件和方法

我有个用C#编写的程序,需要提供其中的一部分功能给使用Python的同事使用,于是研究了一下如何在Python中调用C#的方法,特别是如何注册C#中的回调,这里记录一下。 使用Python for Net类库 使用Pythonnet类库可以在Python中调用C#编写的dll,要使用pythonnet首先要安装,安装方法很简单,在管理员权限下使用命令行程序即可安装: pip install pythonnet 安装完成之后,使用pip list查看一下 …

Delegate Python pythonnet callback pythonnet debug