自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

求索

Make Something Different

  • 博客(295)
  • 资源 (28)
  • 论坛 (12)
  • 收藏
  • 关注

原创 文本压缩算法的对比和选择

本文主要粗略介绍数据压缩主要算法类别,以及最新针对Web文本资源的zStd和Brotli算法的设计要点。为Web业务应用如何使用它们替换传统gzip提供些参考。最后是一个文本有损压缩的尝试。

2017-07-15 16:21:23 12527 3

原创 关于PWA落地问题的思考

PWA是最近一个热门话题,很多开发同学都在尝试落地,其中也有些还在犹豫。这篇文章主要阐述对几个问题的看法,包括iOS支持的问题等,供大家参考。 注: 这不是一篇介绍PWA的文章。

2017-03-29 03:20:39 9124 7

原创 Web业务性能优化技术总结

Web业务的性能优化是一个系统工程,既有深度,又有广度。以下所简称性能均特指Web业务性能。 技术的广度上,主要从大背景下考虑到其各个相关方,基于共同的数据指标发掘和评估方案。 技术的深度上是一个渐进和迭代的过程。可以从性能的本质展到目前各端的主要优化方向。

2017-03-18 01:00:25 2283 2

原创 Chromimum Android渲染介绍

Chromimum Android渲染介绍从概念上一个使用硬件加速(AC)时,页面显示的结构是Viewport -> Layer(s) -> Tile(s),所谓的纹理就是Tile上显示的内容。分块最大的好处就是重绘的单元变小,更利于降低系统开销。

2017-03-14 00:31:46 2680

翻译 2017 前端性能自查表

Smashing Magazine在年底做了一个有意义的事,把最新的Web性能优化实践做了盘点,这里提供其中大部分内容的翻译,供大家参考。有很多我自己也没有深入学习的点,翻译也不能保证准确,所以有时间还是看原文。

2016-12-26 13:37:36 3248

原创 我们真的需要那么多专项吗?

在一个软件开发组织里,若干职能单位负责各个业务模块,然后就是大小各种专项。专项可以横向拉通各个单位,但专项一多,或者有点泛滥,各个业务单位的职责就会有所淡化,目标也有模糊的地方。专项就像是东厂、西厂,可以四处横行,而业务单位却不断要进行各种配合。利也? 弊也?
所谓专项一般为攻关,拉通多个沟通不畅的团队而设。如果团队之间配合无间,规划和执行也都到位,又何来专项!

2016-03-30 01:05:49 1956

原创 iOS Safari阅读模式分析过程

本文为Safari阅读模式分析过程记录,没有做很好的整理。详细看另外一篇<iOS Safari阅读模式研究>.

2016-03-23 00:19:15 6765

原创 iOS Safari阅读模式研究

Safari阅读模式的三个要点: (1) 阅读模式的检测 (2) 阅读模式的执行 (3) 阅读模式页面的控制 这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考。

2016-03-23 00:08:58 9388 2

原创 网络性能评价方法

目前度量网络的品质的方法如果仅以网络连接类型来区分,比如2G, 3G, Wifi等,无法有效感知到当时的网络状态。在同一网络连接类型下,网络的品质仍有大幅波动,可能会因为阻塞以及线路上问题导致延迟上抖动(jitter)、丢失数据包、数据包损坏等情况。本文基于对一段时间的网络数据的记录,进行算法处理,可以测出一个衡量当时网络状态的指标。

2016-03-08 00:41:45 14618 2

原创 页面性能的基础因素 - 《Designing for Performance》

考虑页面性能可以从两种场景,第一个场景也是因素最多的场景,即首次访问。第二个场景则是重复访问,缓存将起决定性作用。浏览器厂商为页面开发者提供了很多工具和插件,比如Chrome DevTools, YSlow和PageSpeed Insights。

2016-03-07 02:06:42 3341 1

原创 高效操作字串的String Reference类

只要不修改字串内容,并不需要另外复制一份。特别是对一些比较大的字串,避免拷贝对内存和性能都有极大的好处。于是Jeffrey Yasskin提出一个String reference : a non-owning reference to a string. 很多大型的项目都提供了各自的实现,包括Boost::StringRef, LLVM的StringRef, Chromium的base::StringPiece。

2016-02-06 06:57:01 4005

原创 何时使用static类(工具类)

一个static类,指全部成员都是static方法构成的,而没有任何成员变量, 也称为Utility class 或者Utility Pattern [参考: Utility Pattern].它可以在程序中直接使用该类的方法,而不用实例化.static class相对单例有更好的性能,原因是它的方法不需要实例方法的动态绑定 (static方法本身不能被复写)。 static类可以看作某一组方法的

2016-02-06 05:51:04 5494

翻译 如何实践设计原则

大家都知道遵循设计原则是开发高质量软件的重要基础,但实际运用时并不容易。Booch在面向对象分析与设计>>中提出了四个基础原则:抽象   核心思想是不变性的概念。去除不关心的属性,而强化重要的属性,帮助人们思考要做什么。封装  核心是分离关注和信息隐藏,让程序借助最少的工作进行可靠的修改。模块化  核心思想是分而治之,各个模块应当高内聚、低耦合。层次结构  核心是对抽象的分级和排序,可以简化对系统

2016-01-09 03:24:23 2447

原创 [Chromium]如何安全的使用PostTask

一般场景决策树如何传递绑定的对象官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h. 传值方式描述示例this 或 对象指针如果对象本身是一个RefCountedThreadSafe, 没有问题.如果是个裸指针,应当尽量避免,除非你可以保证它的线程安全.

2016-01-09 01:25:19 5563

原创 Chormium线程模型及应用指南

核心概念设计上遵循以下原则:1 不要在UI线程做任何阻塞式的I/O操作,以及其它耗时的操作,通过消息传递把各种操作传给相应用途的线程去做。2 不鼓励线程加锁机制和线程安全对象。对象只存在一个线程,通过消息来实现线程之间的通信,线程之间不互相阻塞。通过callback对象实现跨线程请求。一般情况下,我们应该利用一个现有的线程,尽量不要创建新的线程。UI线程实际上会被设置为不允许I/O操作,并且不允许

2016-01-09 01:12:54 3579

原创 Chromium中多线程及并发技术要点(C/C++)

Chromium中提供的线程机制,以及并发处理的工具类。

2016-01-09 00:46:31 3977

原创 Chromium中跨进程文件句柄传递

在POXIS下,允许不同进程间传递文件描述符(File Descriptor))的, 比如传递socket,或者普通文件,进而可以达到不需要重新打开文件,而对相同文件读写的效果(并不是分享文件句柄)。Chromium对这个特性做了封装。

2015-11-02 01:15:05 2856

翻译 [OOD-More C++ Idioms] 写时拷贝 (Copy on Write)

本惯用法的目的是达到延迟拷贝(lazy copy)的优化目的。和延迟初始化(lazy initialization)相似, 选择在恰当的时机更加有效。

2015-10-31 01:00:10 2404 3

原创 软件研发管理:置身其中看问题

从局外人的角度的确可以清晰的发现问题,但很难得到一个合适的解决方法。** 只有将自己融进公司,融进团队,才能更清楚了解问题的本质,才能有好的应对方案。

2015-10-27 23:46:21 2398

翻译 [OOD-More C++ Idioms] 内部类 (Inner Class)

不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。在单个抽象下提供相同接口的多个实现。

2015-10-21 22:50:47 2236

原创 类是如何定义出来的

Object Oriented是多种软件设计方法中的一种,其核心目标是为了降低系统的复杂性,以及代码复用。在OO里,一个类(Class)代表了一组具有共同结构和行为的一组对象(Objects),是OO语言的基础。而类又是又如定义出来的呢?

2015-10-20 22:35:57 2049

翻译 [OOD-More C++ Idioms] 律师与委托人 (Attorney-Client)

律师与委托人 (Attorney-Client)目的控制访问类实现细节的粒度。C++中的friend会开始类内部的所有细节,也因此破坏了封装性。C++没有提供可以选择性使用某一部分私有成员的方式,要么全部开放,要么全部拒绝。如果能选择确定需要使用到的一组成员,而不是全部,就可以降低耦合性。而这个律师与委托人的惯用法就可以精准的控制友元所能使用的成员。

2015-10-17 23:57:47 2716

翻译 Google C++ Style Guide的哲学

Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。

2015-09-30 01:45:12 2810 1

原创 [OOD]违反里氏替换原则的解决方案

关于OOD的几个设计原则,大家耳熟能祥了,不再展开,可以参考设计模式的六大设计原则之里氏替换原则。这里尝试讨论常常违反的形式和解决方案。违反里氏替换原则的根源是对子类及父类关系不明确。我们在设计继承关系常常受一些主观认识的左右,比如Robert C. Martin提到的线段与线的关系,以及被大家说到烂的正方形与矩形。从以前的经验我们认为它们符合继承关系,比如线段是线的较短形式,正方形是矩形的一个特例

2015-09-24 01:00:14 3850 4

原创 为什么浏览器采用多进程模型

为什么浏览器采用多进程模型这个问题的答案似乎是非常清楚的,可以概括为:为了安全、稳定、性能,只是要牺牲点内存作为代价。对于安全和稳定,利用系统的进程机制就可以完成。但是多进程下的进程间通讯(IPC)很慢,而分为多进程后,一些协作任务就要分开到两个进程,如何能保持良好的性能,更不说比单进程模型更高的性能了? 所以这里再次探讨浏览器选择多进程架构的原因,以及对应架构中的要点。

2015-08-14 01:31:38 4085 1

原创 名不符实的读写锁

有一种单一写线程,多个读线程并发的场景,比如测量数据的读取与更新,消费者会比较多,生产者只有一个。以下图为例: 左侧是一种经典的解法,对数据整个操作加锁。为了一个写数据线程,于将所有读线程也进行加锁显然有点浪费了。于是提出读写锁(Reader/Writer Lock), 即使是使用了读写锁,其本质也是一样的,而且在POSIX下的pthread它的内部实现是基于mutex,所以它的开销更大。如果

2015-08-07 00:12:51 2029

原创 线程安全的观察者模式的设计

观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类ObserverListThreadSafe。

2015-08-05 01:12:28 4319

原创 Google C++ Coding Style:右值引用(Rvalue Reference)

Google C++ Coding Style: Rvalue Reference 右值引用是一个C++11特性,标记为T&&。GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用。并且不要使用std::Forward(提供的完美转发特性)。

2015-08-04 00:14:41 1743

原创 Google C++ Coding Style:引用参数

Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。即如下形式:void Foo(const string &in, string *out);在如下情况下, 可以使用const T*的形式: * 需要进行指针的判空 (即空指针是合理的)。 * 需要使用到输入参数的指针或引用形式

2015-07-29 00:43:55 2386 1

原创 大型项目开发: 隔离 (《大规模C++程序设计》书摘)

书中第六章 隔离。 主要在撰述什么需要定义在头文件?什么应当移到编译单元中? 核心仍然是先区分接口定义与实现细节。实现细节的改变会导致客户代码的重新编译,从逻辑上也表示与客户代码间可能存在着强耦合。实现细节与隔离主要考察以下实现细节,它们会在接口中引入实现细节,也是需要考虑进行隔离的内容:继承分层 简单的说就是类的成员中有另一个类的实例时,如Foo mFoo. 这个类就会依赖于Foo的定义。

2015-07-20 00:47:06 2765

原创 大型项目开发:谨慎使用智能指针

智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点:1.性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。2. 对象释放的时机不明确。比如std::auto_ptr,总让人感觉不明不白,从而引入一些隐晦的问题。

2015-07-13 00:30:37 5732

原创 大型项目开发: 头文件顺序

经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<<大规模C++程序设计>>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例说明。

2015-07-09 00:25:17 4345 2

原创 技术债务管理以及Firefox/Chromium的债务评价

现在的软件开发是在遍地敏捷,人人讲唯快不破的时代,哪有人有时间思考代码质量,设计的质量? 哪个又不是从一堆代码中杀出血路来实现另一个功能?一个产品都存活不了几年,何必考虑什么可维护性?我们追求进度的时候,总是要牺牲些东西,或是破坏了一些东西等着后面补。这就是技术债! 管理不好,债台高筑,即使不破产,也是要拆东墙,补西墙的玩平衡。现实是残酷的,但不影响我们抬头看看这个世界。技术债务技术债务(Techn

2015-07-04 01:12:41 2439 2

原创 如何避免类的膨胀

类的膨胀(Bloating)指的是类中成员过多,甚至出现无序增加的情况。过大的类,会使得复杂度急剧增加,维护会变得更为困难。所以需要控制类的增长。本文总结了一下,简单介绍四种解决的方式,我故意用四个来讲,主要为了介绍最后一种方式。

2015-06-25 02:11:29 3412 4

原创 API的设计与实现

关于API的设计与实现API的设计是软件开发中一个独特的领域。最主要的特殊点在于API是供开发者使用的界面,即Application Programmer Interfaces。所以相对于依据软件设计的原则,考虑用户的”体验”会更加重要。许多著名的工具和库的作者都写过相关的著作,详细的论述他们在API上的设计与实现要点。本文是尝试对前人工作的总结。

2015-06-24 00:09:17 10441 1

原创 软件设计的复杂度

什么是软件设计的复杂度软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。本文介绍通过分解、改善依赖关系,以及抽象的方式来降低复杂度。

2015-04-30 00:57:32 8277 1

原创 [OOD] 隔离变化-桥接模式

使用一个抽象的接口隔离变化,既提高了各层的内聚性,又降低它们间的耦合。符合OO原则中的: 1. 封装变化 2. 针对接口编程,而不针对具体的实现。 3. 降低交互对象的耦合度。

2015-04-21 00:45:18 2183

原创 [OOD] 适配器模式

适配器模式常常与桥接模式相比较,两者最大的不同在于解决的问题不同。适配器用于对接两个不同的接口,而桥接则主要为了隔离变化。从应用上来说,一个是被动的,一个是主动的。 所谓被动的,就是当前的接口的差异是无法轻易改变的,必须引入一个中间层来解决。而中间层的引入往往带有性能、以及不必要的数据拷贝等开销,详细参考关于层的反模式讨论。如果接口是可控,就要尽量避免接口不一致的情形。而不是等待使用Adapter来处理。

2015-04-21 00:10:27 1901

原创 [OOD] 为什么单一职责原则(SRP)是最难运用的

RP是所有设计原则最简单的,但也是最难运用的。现实工作中,关于一个类是否符合SRP,或者是否有必要符合SRP的讨论是经常发生的。争论的关键在于职责的定义,但我理解SRP真正的核心是关注于变化。

2015-04-18 23:53:47 2623 1

原创 [架构设计] 组件和模块的区别

组件(Component)和模块(Module)又是一对容易混淆的名词,也常常被用来相互替换。个人总结,从设计上来看,组件强调复用,模块强调职责(内聚),或者说组件是达到可复用要求的模块。

2015-04-17 00:04:55 23616 5

Google Chrome中的高性能网络

内容是"The Performance of Open Source Applications" (POSA)的草稿, 也是The Architecture of Open Source Applications的后继者. POSA囊括了一批针对性能的优化和设计,以及开发过程中的性能管理等内容的论文

2013-09-03

High Performance Browser Networking

Ilya Grigorik写的强文。 What every web developer should know about networking and web performance

2013-08-13

WebKit中两个小设计(以小见大)

通过介结WebKit中使用的两个小的技术点,来展示一些设计概念。

2013-07-26

面向 HTML5 的图形加速和面向移动设备的 JAVASCRIPT 引擎 JIT 优化

本文将首先介绍 HTML5 带来的性能挑战。由于渲染引擎和 JavaScript 引擎 是 Web 运行时两个重要的基本构造模块,本文随后将讨论图形加速技术和 即时 (JIT) 优化技术应用于英特尔® 凌动TM [2] 处理器平台的解决方案,以显 著提升这两大组件的性能。文中评估了我们的解决方案对典型 HTML5 和 JavaScript 基准测试的影响,同时展望了未来工作的走向。

2013-06-09

Java虚拟机即时编译器的一种实现原理

讲述了JIT中的Trampoline的实现,对于了解JIT很有帮助.

2013-06-09

主动自我优化的编译器

ADAPTIVE OPTIMIZATION FOR SELF - RECONCILING HIGH PERFORMANCE WITH EXPLORATORY PROGRAMMING 关于编译器优化的好文章,包括Inline Cache, Type feedback, Adaptive Recompilation, Performance Evaluation, Self Improving compiler...

2013-06-09

LLDB查看数据类型的示例脚本

不知道大家都没有遇到过在gdb和lldb里输出一个类时困扰,常常要一个个属性展开下去,或者调用提供函数来检查。我分享一个使用LLDB脚本来简化变量输出的方法。

2013-01-14

McCabe的复杂度论文

McCabe关于软件复杂度的论文,全面而细节。反观现在许多关于McCabe复杂度的介绍却没能这么详细透彻。

2013-01-07

软件维护计划示例

软件维护计划的例子. 涉及范围、成本、风险等内容。

2013-01-07

LLDB的Python扩展脚本

在LLDB下可以使用Python编写脚本扩展指令。 可以参考http://blog.csdn.net/horkychen

2012-12-20

Trace-based JIT简介(对Method JIT的改进)

IBM的一份对Method JIT和Trace JIT说明的文档。

2012-08-22

二维条码生成插件

二维条码生成插件,重构后。支持右击菜单,简化JS.

2012-07-20

二维条码的插件(Chrome)

做了一个二维条码的插件,默认将当前网页地址转为二维条码。

2012-07-20

二维条码生成插件 (Chrome)

做了一个二维条码的插件,默认将当前网页地址转为二维条码。

2012-07-14

Extreme Programming Explained英文版 第2版

XP的专业名词翻译得五花八门。这本书是正统之作,有个英文版,可以对照看看一些专业名词。

2012-06-28

代码优化的三个阶段

很久以前写的一个PPT,讨论了算法、流程及编码技巧三个层次的代码优化。

2011-11-23

Delphi数据库开发入门

2004年左右为同学写的Delphi数据库开发的入门教程,有一些纪念意义。

2011-11-23

<<突破思维障碍>>的思维导图 (Freemind)

<<突破思维障碍>>的思维导图 (Freemind)

2011-10-18

使用Cocoa开发的二十四点计算程序

使用Cocoa写了一个小的二十四点计算程序,可供初学者学习Cocoa使用。中间有一个递归调用的示例。 *XCode 3.2

2011-05-21

Lenovo LJ2000打印机驱动

以前自己分析了LJ2000数据所写的驱动程序,可以支持Mac OS及Linux,原来放在MacLinux.cn上,后来网站关掉了。偶然发现竟然有人在引用它,觉得它可能还有点用,就放上来分享.里面包含三个包: Linux:2 (DEB&RPM) Mac OS:1

2010-12-06

代码大全之编程基本功

小组内对代码大全学习的资料,包含的是程序撰写的基本概念!

2010-10-03

PMBOK 3思维导图(第3&4章)

利用MindManager绘制的PMP第3及4章的思维导图,有助于组织记忆!

2010-05-23

The book of Wireless

比较系统的介绍Wireless的资料! 涉及Wireless的基础知识和技术背景!很值得参考,唯一不足是英文书!

2010-03-20

UPnP Device Architecture

UPnP 参考资料! UPnP是实现DLNA的核心,所以读一读会有一些基本概念!

2010-03-18

成功人士的七个习惯 [史蒂芬 柯维]

好评一堆的励志书!我个人认为其最大的特色是重视人的内在修为,而不是速成式的说教!

2009-11-23

STL Documents from SIG.com

将SIG上的STL Documents下载后转为CHM文件,方便查询! 本来cnheying已经做了,可惜下载不了,我重做了一下跟大家分享!

2009-09-20

实战KDevelop进行Linux软件开发

很多高手在Linux下很喜欢使用Makefile进行开发,但事实上并不是所有人都适合使用Makefile,尤其是初入Linux世界的人。 许多年来,Linux很难得以普及,就是因为使用及开发的难度被无端地夸大了,许多高手都以能运用复杂的指令为荣,而不愿意轻意妥协于那些更易于掌握的工具。而我认为不要在意用什么开发,只要关注你要开发什么!所以至于工具,自然由你决定。KDevelop也是一个选择,至少它可以使开发者摆脱Makefile体系的困扰! 软件开发要以产品论英雄,任何工具都是熟能生巧罢了,结果也都是殊途同归,没什么复杂的。

2009-03-11

实战KDevelop进行Linux软件开发

很多高手在Linux下很喜欢使用Makefile进行开发,但事实上并不是所有人都适合使用Makefile,尤其是初入Linux世界的人。 许多年来,Linux很难得以普及,就是因为使用及开发的难度被无端地夸大了,许多高手都以能运用复杂的指令为荣,而不愿意轻意妥协于那些更易于掌握的工具。而我认为不要在意用什么开发,只要关注你要开发什么!所以至于工具,自然由你决定。KDevelop也是一个选择,至少它可以使开发者摆脱Makefile体系的困扰! 软件开发要以产品论英雄,任何工具都是熟能生巧罢了,结果也都是殊途同归,没什么复杂的。

2009-03-11

Horky的留言板

发表于 2020-01-02 最后回复 2020-01-02

为什么研发团队的QA容易缺位?

发表于 2013-05-17 最后回复 2017-06-28

为什么V8引擎这么快?

发表于 2013-05-08 最后回复 2013-05-20

Windows XP下的电池余量显示的问题

发表于 2010-09-20 最后回复 2012-11-23

Qt/Embedded有没有LGPL的授权和特许费

发表于 2010-03-08 最后回复 2012-11-23

为什么取不到对象中定义的对象

发表于 2012-06-14 最后回复 2012-06-14

写了一个抛出异常的函数,欢迎拍砖

发表于 2012-06-08 最后回复 2012-06-11

大家谈谈对项目团队和产品团队的理解

发表于 2010-06-08 最后回复 2010-06-09

大家如何看待员工兼职?

发表于 2010-04-19 最后回复 2010-04-23

DMO的输出格式设定

发表于 2010-03-23 最后回复 2010-03-30

关于Either EOF or BOF is True, or the current record has been deleted.

发表于 2003-02-11 最后回复 2003-02-11

关于Either EOF or BOF is True, or the current record has been deleted.

发表于 2003-02-11 最后回复 2003-02-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除