关系逻辑

写出优质Java代码的4个技巧

僤鯓⒐⒋嵵緔 提交于 2020-02-26 02:06:02
写出优质Java代码的4个技巧 我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的。然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最有效的方法。在 前一篇文章 中,我们讨论了必要时可以使用的四种特殊技术,这些特殊技术可以创建更好的Java软件;而本文我们将介绍一些有助于解决常见问题的通用设计策略和目标实现技术。 1 .只做有目的性的优化 大型软件系统肯定非常关注性能问题。虽然我们希望能够写出最高效的代码,但很多时候,如果想对代码进行优化,我们却无从下手。例如,下面的这段代码会影响到性能吗? public void processIntegers(List<Integer> integers) { for (Integer value: integers) { for (int i = integers.size() - 1; i >= 0; i--) { value += integers.get(i); } } } 这就得视情况而定了。上面这段代码可以看出它的处理算法是O(n³)(使用 大O符号 ),其中n是list集合的大小。如果n只有5,那么就不会有问题,只会执行25次迭代。但如果n是10万,那可能会影响性能了。请注意,即使这样我们也不能判定肯定会有问题

考研复试数据库(五)

不想你离开。 提交于 2020-02-25 22:20:13
第五部分 数据库设计 (一)、考核内容 (1) 用户需求分析、概念结构设计 (2) 逻辑结构设计 (3) 物理结构设计 (4) 数据库结构与应用行为设计 (二)、考核要求 (1)了解数据库生命周期。 (2)了解数据库设计规划与用户需求分析。 (3)掌握数据库概念结构设计步骤与方法(实体联系模型)。 (4)掌握数据库逻辑结构设计方法,由实体-联系模型向关系模型的转换。 (5)了解数据库的物理结构设计方法:索引、数据聚簇。 (一)选择 1.在数据库设计中,用E-R 图来描述信息结构但不涉及信息在计算机中的表示,它是数据库设计的 ( )段。 A.需求分析 B.概念设计 C.逻辑设计 D .物理设计 2.在关系数据库设计中,设计关系模式是( )的任务。 A.需求分析阶段 B.概念设计阶段 C.逻辑设计阶段 D .物理设计阶段 3.数据库物理设计完成后,进入数据库实施阶段,下列各项中不属于实施阶段的工作是( )。 A.建立库结构 B.扩充功能 C.加载数据 D .系统调试 4.在数据库的概念设计中,最常用的数据模型是 。 A.形象模型 B.物理模型 C.逻辑模型 D .实体联系模型 5.从E-R模型关系向关系模型转换时,一个M∶N联系转换为关系模型时,该关系模式的关键字是 。 A.M端实体的关键字 B.N 端实体的关键字 C.M端实体关键字与N端实体关键字组合 D .重新选取其他属性 6

Oracle Dataguard原理

房东的猫 提交于 2020-02-22 18:08:39
Oracle DataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。 DataGuard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。在生产数据库的保证"事务一致性"时,使用生产库的物理全备份创建备库,备库会通过生产库传输过来的归档日志或重做条目自动维护备用数据库。 DataGuard数据同步技术有以下优势: 1) Oracle数据库自身内置的功能,与每个Oracle新版本的新特性都完全兼容,且不需要另外付费。 2) 配置管理较简单,不需要熟悉其他第三方的软件产品。 3) 物理Standby数据库支持任何类型的数据对象和数据类型; 4) 逻辑Standby数据库处于打开状态,可以在保持数据同步的同时执行查询等操作。 5) 在最大保护模式下,可确保数据的零丢失。 一、架构 Oracle DataGuard由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成。组成Data Guard的数据库通过Oracle Net连接,并且有可以分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制,不受操作系统的限制。 1.Primary 数据库

[源码分析] 从源码入手看 Flink Watermark 之传播过程

心已入冬 提交于 2020-02-22 17:38:13
[源码分析] 从源码入手看 Flink Watermark 之传播过程 0x00 摘要 本文将通过源码分析,带领大家熟悉Flink Watermark 之传播过程,顺便也可以对Flink整体逻辑有一个大致把握。 0x01 总述 从静态角度讲,watermarks是实现流式计算的核心概念;从动态角度说,watermarks贯穿整个流处理程序。所以为了讲解watermarks的传播,需要对flink的很多模块/概念进行了解,涉及几乎各个阶段。我首先会讲解相关概念,然后会根据一个实例代码从以下几部分来解释:程序逻辑/计算图模型/程序执行。最后是详细Flink源码分析(略冗长,可以选择性阅读)。 0x02 相关概念 流计算被抽象成四个问题,what,where,when,how。 window解决的是where,也就是将无界数据划分成有界数据。 window的数据何时被计算是when?解决这个问题用的方式是watermark和trigger,watermark用来标记窗口的完整性。trigger用来设计窗口数据触发条件。 1. 乱序处理 乱序问题一般是和event time关联的, 对于一个流式处理系统的process time来说,是不存在乱序问题的。所以下面介绍的watermark/allowedLateness也只是在event time作为主时间才生效。 Flink中处理乱序依赖的

服务性能优化过程

浪尽此生 提交于 2020-02-22 15:11:23
背景 组内有好几个线上服务,除了业务逻辑不一样,请求处理过程基本上都是一致的。这些服务的执行逻辑都非常简单,但是有几个问题: 单机QPS很低,需要很多台机器 99分位耗时比理论上的长很多 在服务的负载达到上限时,服务器的负载却非常低 上面的这些问题在财大气粗的公司面前都不是问题啊,性能不够加机器! 性能不够加机器! 上游再一次过来反映超时问题时,为了壮年程序员的尊严,这次刚好有时间决定不再单纯的加机器,要把这个程序优化一下,用一次屠龙技。 技术栈: 语言:java 通信方式:thrift,server模式为THsHaServer redis客户端:jedis 模型:xgboost 执行环境:docker,8核 8G 缓存集群:通信协议为redis,但实现方式和redis不一样 优化后结果 优化过程 想要提升程序的性能,首先需要找到程序的瓶颈所在,然后有针对的去进行优化。 流程分析 优化前流程图 这个流程图省略了业务处理逻辑,只展示了各个线程之间的交互关系。构造redis请求的那部分逻辑,其实使用了两个forkjoin线程池,但它们两个的逻辑非常类似,为了简化把它们合并到一个流程中了。流程图中有两个深红色的步骤,很明显的看出两个明显能影响性能的地方。 结合服务的执行环境,可以总结出以下问题: 线程数过多 由于操作系统对线程的抢占式调度,线程频繁的上下文切换会带来几个问题:

浅析Xilinx家DDR控制器MIG的使用

微笑、不失礼 提交于 2020-02-20 08:04:52
FPGA的片上存储资源bram简单好用,时序清晰,要不是总容量往往就几十Mb谁愿意用DDR呀······ 害,言归正传,因为设计需要存储1477x1800x3 双精度浮点复数这样的大号矩阵,所以只能放到DDR上去进行读写。之前在网上找了好多资料,但发现都没有一个很完整的教程教你怎么使用DDR控制器IP核MIG(Memory Interface Generator),所以写了这篇文章主要希望能帮初学者快速上手MIG的使用以实现DDR读写。 介绍MIG之前,我觉得有必要先对DDR做一个介绍,DDR SDRAM(Double Data Rate Synchronous Dynamic Random Access Memory,实际上还分为DDR SDRAM,DDR2 SDRAM,DDR3 SDRAM,DDR4 SDRAM,主要是数据预取prefetch和工作频率的不同,感兴趣的大家可以自己查),搭眼一看,这玩意本质上不就是数字集成电路里学的DRAM嘛(电容存储,会漏电,时不时需要刷新blablabla······),而double data rate说的是他在clock的上升沿和下降沿都会进行数据读写,设想如果用户逻辑侧的时钟频率和DDR的工作频率之比为1:4的话,用户侧的一个clk, 那么DDR实际上进行了4*2(上下沿)=8次读写操作。 DDR3的内部是如上图的存储阵列组成

王垠-编程的智慧

泄露秘密 提交于 2020-02-18 21:54:12
编程的智慧 编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋。然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获。 ​ 反复推敲代码 有些人喜欢炫耀自己写了多少多少万行的代码,仿佛代码的数量是衡量编程水平的标准。然而,如果你总是匆匆写出代码,却从来不回头去推敲,修改和提炼,其实是不可能提高编程水平的。你会制造出越来越多平庸甚至糟糕的代码。在这种意义上,很多人所谓的“工作经验”,跟他代码的质量其实不一定成正比。如果有几十年的工作经验,却从来不回头去提炼和反思自己的代码,那么他也许还不如一个只有一两年经验,却喜欢反复推敲,仔细领悟的人。 有位文豪说得好:“看一个作家的水平,不是看他发表了多少文字,而要看他的废纸篓里扔掉了多少。” 我觉得同样的理论适用于编程。好的程序员,他们删掉的代码,比留下来的还要多很多。如果你看见一个人写了很多代码,却没有删掉多少,那他的代码一定有很多垃圾。 就像文学作品一样,代码是不可能一蹴而就的。灵感似乎总是零零星星,陆陆续续到来的。任何人都不可能一笔呵成,就算再厉害的程序员,也需要经过一段时间,才能发现最简单优雅的写法。有时候你反复提炼一段代码,觉得到了顶峰

Linux Device Driver 3rd 下

做~自己de王妃 提交于 2020-02-16 09:34:54
第十一章 内核的数据类型 坚持使用严格的数据类型,并且使用-Wall -Wstrict-prototypes选项编译可以防止大多数的代码缺陷 内核使用的数据类型主要分为三大类: ① 标准C语言类型,类似int ② 类似u32这样有确定大小的类型 ③ 类似pid_t这样用于特定内核对象的类型 使用标准C语言类型 在不同的体系架构上,普通C语言的数据类型所占空间的大小并不相同。 Linux系统中,指针和long整型的大小总是相同的。 为数据项分配确定的空间大小 有时内核代码需要特定大小的数据项,多半是用来匹配预定义的二进制结构或者和用户口空间进行通讯或者通过在结构体中插入"填白 padding"字段 来对齐数据。 当需要知道自己的数据大小时,内核提供了下列数据类型,定义在<asm/types.h>中 ① u8; 无符号字节8位 ② u16; 无符号字 16位 ③ u32; 无符号32位 ④ u64; 无符号64位 相应的有符号类型也存在,只需将名字中的u用s替换就可以了。 接口特定的类型 内核中最常用的数据类型由typedef声明,这样可以防止出现任何移植性问题。 当需要打印一些接口特定的数据类型时,最行之有效的方法就是将其强制转换成可能的最大类型(通常是long或者unsigned long),然后用相应格式。 因为格式和类型相匹配,而且也不会丢失数据位

CPU中断的工作原理,从最底层讲起

a 夏天 提交于 2020-02-15 13:23:23
  前言   中断的概念属于硬件层。虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要。   我们在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的为我们服务。   处理器基于硬件封装对外的指令集,底层语言封装指令集为我们提供更加简单的抽象,高级语言基于底层语言赋予程序更明确的语义。可以看到在这条关系链条中,下层的变动会牵一发而动全身影响上层。而上层想要提高效率,改变机制也必须得到下层的支持。   像 I/O 处理的不断演进,从占用CPU等待到通过中断阻塞等待到多路复用与异步,如果没有下层的支持上层是不可能实现的。而不了解下层的原理我们也很难真正理解一个机制的高效的原因。因此了解下层的原理对应用层工程师来说同样重要。   什么是中断   现代计算机具有多任务处理的能力,往往一台我们办公使用的普通计算机上都会同时运行着几十上百的任务(进程)。我们很难想象,我们点击一下鼠标,需要等待计算机的进程调度模块调度到鼠标处理任务后再给我们做出响应,这对我们来说是不可接受的。   现实是我们在点击鼠标或键盘时(正如我现在在做的事情),计算机会立即给我反馈处理结果,计算机与我们之间是在进行实时交互的。而实时性的实现便是依赖了中断,中断是为了顺应人们对实时性交互的需求而产生的技术。中断之所以有用,是因为它会立刻停下当前的程序(软件

FPGA基础知识关键点摘要

梦想与她 提交于 2020-02-15 09:19:03
FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别: 组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别! 组合时序容易出现竞争冒险现象出现亚稳态,时序逻辑不会出现,且更容易达到时序收敛 所以必须很好的掌握时序逻辑 设置不使用的 IO 为 为 in-tri 状态 RTL,Register Transfer Level,直译为寄存器转换级,顾名思义,也就是在这个级别下,要描述各级寄存器(时序逻辑中的寄存器),以及寄存器之间的信号的是如何转换的(时序逻辑中的组合逻辑)。 RTL 级代码 ︴ 综合 逻辑电路 ︴ 布局布线 ︴ 电路 可综合的语法就是那些可以在电路上实现的语法… 行为级语法就是不能够实现在电路里面,却可以作为仿真验证的高层次语法! reg型和wire型信号有什么本质的区别? 此问题较大,需常百度查查! 二.阻塞和非阻塞赋值: =,<= 区别与联系? 在输入输出GPIO口电路中,用到assign,它的详细用法如下: 1.被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。 2.另外一个区别则是更细微的差别:举个例子, wirea; regb;