work

并发编程下的性能定律(翻译)

空扰寡人 提交于 2020-01-04 05:05:03
并发编程下的性能定律 ( 翻译 ) 理解 Amdahl 定律 如果你想利用多核的优势在尽可能少的时间运行尽可能多的指令,那么就需要以并行的序列分离代码。然而,大多的算法需要运行一些串行代码来调整并行执行。例如,并行执行很多代码块,最后收集他们执行的结果。那些分解并行执行工作复杂和收集执行结果的代码是串行代码,它是不能利用并行的优势的。如果你的算法中有很多这样的代码片段,那么串行代码所占的比例就会增加,并且能够获取到的性能收益就会减少。 Gene Amdahl 是一个著名计算机架构师,当一个系统中仅有少量的计算机改善硬件的时候,那么能够获得最大的性能改善是多少呢?他做了大量与这方面有关的观察研究。他使用这些观察结果定义了 Amdable’s Law ,它是由一个预测使用多核处理器在理论上可以获得最大性能改善的公式组成。它也使用于那些运行在多核处理器上的并发算法。 Maximum speedup ( in times ) = 1/((1-p) + p/n) 在这个公式中 P 就是代码中可以完全并行执行的部分。 n 就是可用的执行单元的数目(处理器或者物理核心)。 根据这个公式,如果你有一个仅有 50% ( P = 0.5 )的工作需要并行执行的算法,那么在双核微处理器可以获得的最大速度是 1.33 倍。图 1-8 阐述了一个拥有 1000 个工作单元的算法分解成 500

题解 P1130 【红牌】

随声附和 提交于 2020-01-03 08:30:49
逆推dp经典题目:数字三角形的折叠版 为什么这么说? 因为我们会发现:除了每一次都特判一下是否转换行号以外,剩下的思想没什么不同。 没看题目的 看这里 先定义: n,m 是步骤数目,小组数目 work[i][j] 表示第 i 个小组第 j 步需要的天数 f[i][j] 表示当前第 i 个小组第 j 步的最优天数 首先我们先看到这个题说是要 求最小天数 然后我们知道这个最小天数是 由原先的两个最小天数分别加上当前小组工作天数,然后二者求最小值 (因为前面的两个子状态——天数决定了后面的状态——当前最小天数) 这中间告诉我们 当最下面的小组还想向下找小组,就返回最上面的小组1 。 所以我们得出几个推论: 因为最后不同的小组会得到不同的值,所以我们应当求出最后一步中的最小天数值(最小值跑最后一列一遍) 普通(指的是不看第三点)的dp状态转移方程就是 \[ f[i][j]=min(f[i-1][j-1]+work[i][j],f[i][j-1]+work[i][j]) \] 逆着想,当 i=1 的时候,决定当前最小天数的是 i=n 和 i=1 两个子状态,所以当 i=1 的时候,转移的 i-1 就应当变成 n 。 于是得出下面的递推式: \[ f[i][j]=min(f[i!=1?i-1:n][j-1]+work[i][j],f[i][j-1]+work[i][j]) \]

MySQL基础之事务编程学习笔记

自古美人都是妖i 提交于 2020-01-01 12:27:54
MySQL基础之事务编程学习笔记 在学习《MySQL技术内幕:SQL编程》一书,并做了笔记。本博客内容是自己学了《MySQL技术内幕:SQL编程》事务编程一章之后,根据自己的理解做的笔记,内容和书本并不一致,不过书本实验都经过自己验证,基于MySQL5.7版本。做笔记的目的是方便自己复习,同时分享出来或许对其他人或许有点帮助 1、事务概述 事务是数据库区别于文件系统的重要特性之一,提到事务肯定会想到事务的4个特性ACID,要保证业务的正常使用,必须保证ACID,ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),一个运行良好的事务系统也是要求具备这些特征 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不能只执行一部分操作 一致性(consistency):一致性要求数据库总是从一个一致性的状态转换为另外一个一致性的状态,比如银行转账的例子,一个用户转账账号里减了200元,另外一个收账账号必须增加,一个失败数据必须全部回退状态,要保证事务一致性 隔离性(isolation):一般来说,一个事务所做的修改在提交之前对其它事务来说都是不可见的 持久性(durability):事务一旦提交

Visual Studio 11增强支持的标准 C++11 介绍

吃可爱长大的小学妹 提交于 2020-01-01 02:45:49
Visual Studio 11增强支持的标准 C + + 11 现在支持此预览的 Visual Studio 的 STL 中的新头文件可以进行多线程编程和异步操作管理。 <thread>,<future>,<atomic>,<time>,<mutex>,<condition_variable>,<ratio>,<filesystem> 头文件<thread>作为其名称来创建和操作线程 1.thread t([]() 2. { 3. cout << "ThreadID : " << std::this_thread::get_id() << endl; 4. }); 5. t.join(); 1.thread t([]() 2. { 3. cout << "ThreadID : " << std::this_thread::get_id() << endl; 4. }); 5. t.join(); 这是传递给线程的类的构造函数的一种方法,而不是在这里我们使用Lambda 表达式中引入C + + 11Join ()方法,这是一个调用阻塞,使主线程等待,直到线程完成他的工作。如果要解耦变量的类型线程,线程在 Windows 那里 调用 的detach()方法,这样做违背计划的detach()方法,不会影响与线程句柄关联的窗口 (CloseHandle)。因此可能是使用变量的 t 型线

vCard学习笔记

江枫思渺然 提交于 2020-01-01 02:08:17
vCard 学习笔记 转载时请注明出处: http://blog.csdn.net/absurd/ vCard ?看起来像个专业术语,一下让人敬畏三分。当然这全仰仗着第一个字母 v 了,如果把 v 去掉,剩下的 Card 就是名片的意思,简单得不能再简单了。事实上 vCard 就是一个描述名片的规范。为什么前面加个 v 呢,据说这个规范最初是由 Versit 联盟提出的,至于为什么 v 是小写的,据说是出于技术限制 ( technical restrictions ) ,不懂不懂,也懒得管它了。 奇怪!名片也要规范吗?对大多数人来说,名片就是姓名 + 电话号码,有必要定一个规范吗?当然有必要,任何用于交换的数据都需要定规范,否则大家划不是一套拳,就没有办法交换了。比如一张名片的信息本来为:姓名 : 张三,手机: 13012345678 。在不同的软件中,表现方式可能千差万别,有的表示为 : 张三 , 13012345678 。有的表示为 : name= 张三 ,mobile=13012345678 。 … 总之,种种千奇百怪的写法都有。 有了 vCard 这个规范,大家都按统一的格式描述名片(至少在交换时)。你可以把 outlook 或者 foxmail 中的名片,上传放到手机中,手机可以是 nokia 的,也可以是 moto 的,或者其它任何支持 vCard 的手机

Vcard 解析 类

匆匆过客 提交于 2020-01-01 02:07:57
自己写的 C# 解晰VCARD 的类 简单的VCARD Code using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Data; namespace VCARD { public class VCard { /// < summary > /// 组结构 /// </ summary > public struct Group { public string N;//组名称 public string UID;//组ID public string TYPE;//类别 public string TYPE1;//系统组使用的 } /// < summary > /// 邮件结构 /// </ summary > public struct Email { /// < summary > /// 家庭地址 /// </ summary > public string ADR_HOME; /// < summary > /// 公司地址 /// </ summary > public string ADR_WORK; /// < summary > /// 生日 /// </ summary >

Hotspot 垃圾回收之BarrierSet(二) 源码解析

ぃ、小莉子 提交于 2019-12-28 20:18:41
目录 一、CardTableExtension 1、定义 2、resize_covered_region 二、G1SATBCardTableLoggingModRefBS 1、write_ref_field_pre_work /write_ref_array_pre 2、set_card_claimed /g1_mark_as_young /mark_card_deferred 三、G1SATBCardTableLoggingModRefBS 1、构造方法和initialize 2、G1SATBCardTableLoggingModRefBSChangedListener 3、write_ref_field_work /write_region_work /write_ref_array_work /invalidate 4、resize_covered_region 本篇继续上一篇 《Hotspot 垃圾回收之BarrierSet(一) 源码解析》 探讨BarrierSet其他的子类的实现。 一、CardTableExtension 1、定义 CardTableExtension的定义在hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp中

Python学习:函数装饰器

寵の児 提交于 2019-12-28 15:52:31
概述 装饰器(decorators)是Python的一个重要的部分,简单的介绍,函数装饰器是修改其他函数的功能的函数,有助于代码更加的简洁,也更有Python范。 函数皆是对象 首先,需要理解在Python中,函数也是对象。比如如下的代码: def hi ( name = "yasoob" ) : return "hi " + name print ( hi ( ) ) #输出:'hi yasoob' #可以将一个函数名赋值给一个变量。注意只是函数名func,而不是func()的形式 greet = hi print ( greet ( ) ) #输出:'hi yasoob' #如果删除掉旧的函数名hi,但是不影响新的函数名greet,因为本质上hi与greet只是保存函数地址的变量 #只要函数地址是有效的,则均可以通过变量保存的函数名来调用函数 del hi print ( hi ( ) ) #输出:NameError print ( greet ( ) ) #输出:'hi yasoob' 在函数中定义函数 在Python中,可以在函数中定义另一个函数,也就是可以创建嵌套的函数: def hi ( name = "yasoob" ) : print ( "now you are inside the hi() function" ) def greet ( ) : return

Python:asyncio模块学习

匆匆过客 提交于 2019-12-27 08:32:48
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了协程的概念,可是这个还是以生成器对象为基础,3.5则确定了协程的语法。下面将简单介绍asyncio的使用。实现协程的不仅仅是asyncio,tornado和gevent都实现了类似的功能。 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。 future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别 async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。 上述的概念单独拎出来都不好懂,比较他们之间是相互联系,一起工作。下面看例子,再回溯上述概念,更利于理解。

后缀数组

旧巷老猫 提交于 2019-12-27 04:24:18
追随蔡大神的脚步,开始后缀数组的学习。 http://www.cnblogs.com/EC-Ecstasy/ //时间不够不定时不定期完善 一、后缀数组的定义 把一个字符串的后缀全部搞出来,比如“aabaaaab”的后缀就是"aabaaaab”,“abaaaab”,“baaaab”,“aaaab”,“aaab”,“aab”,“ab”,“b”,分别编号为1,2,3,4,5,6,7,8。 然后就有两个数组,一个是rank[],一个是sa[]。rank[i]表示第i个后缀排在第几名,sa[i]表示排第i名是哪个后缀。显然这两个数组为逆运算。(sa[rank[i]]=i,rank[sa[i]]=i) 基排倍增写法。 每次倍增,分两个关键字。 模版1(远古写法) var s:ansistring; n,tot:longint; c,x,y,rank,sa:array[0..1000]of longint; procedure first; var i:longint; begin readln(s); n:=length(s); for i:=1 to n do x[i]:=ord(s[i]); fillchar(c,sizeof(c),0); for i:=1 to n do inc(c[x[i]]); for i:=1 to 128 do inc(c[i],c[i-1]); for i: