当前位置:  编程技术>移动开发
本页文章导读:
    ▪Google Chrome中的高性能网络 (3)        Google Chrome中的高性能网络 (三) 使用预连接优化了TCP连接管理 已经预解析到了主机名,也有了由OmniBox和Chrome Predictor提供信号,预示着用户未来的操作。为什么再进一步连接到目标主机,.........
    ▪ 单例模式的五种写法        单例模式的5种写法单例模式(Singleton Pattern): 在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析。那么下面就来轻轻地探讨一下.........
    ▪ GIPS-NetEQ 最大化话音质量、最小化延迟       GIPS-NetEQ 最大化语音质量、最小化延迟1. GIPS NetEQ概述             GIPS NetEQ是一项专为IP电信系统开发的高级语音质量处理技术,其能够在大幅提高语音质量的同时,有效地减少由于buffering带.........

[1]Google Chrome中的高性能网络 (3)
    来源: 互联网  发布时间: 2014-02-18
Google Chrome中的高性能网络 (三)
使用预连接优化了TCP连接管理


已经预解析到了主机名,也有了由OmniBox和Chrome Predictor提供信号,预示着用户未来的操作。为什么再进一步连接到目标主机,在用户真正发起请求前完成TCP握手呢?这样就可省掉了另一个往返的延迟,轻易地就能为用户节省到上百毫秒。其实,这就是TCP预连接的工作。 通过访问chrome://dns 就可以看到TCP预连接的使用情况。



首先, Chrome检查它的socket pool里有没有目标主机可以复用的socket, 这些sockets会在socket pool里保留一段时间,以节省TCP握手时间及启动延时(slow-start penalty)。如果没有可用的socket, 就需要发起TCP握手,然后放到socket pool中。这样当用户发起请求时,就可以用这个socket立即发起HTTP请求。


打开 chrome://net-internals#sockets 就可以看到当前的sockets的状态:



你可以看到每一个socket的时间轴:连接和代理的时间,每个封包到达的时间,以及其它一些信息。你也可以把这些数据导出,以方便进一步分析或者报告问题。有好的测试数据是优化的基础, chrome://net-internals就是Chrome网络的信息中心。


使用预加载优化资源加载


Chrome支持在页面的HTML标签中加入的两个线索来优化资源加载:

  <link rel="subresource" href="/javascript/myapp.js">
  <link rel="prefetch"    href="/images/big.jpeg">


在rel中指定的subresource(子资源)和prefetch(预加载)非常相似。不同的是,如果一个link指定rel(relation)为prefetch后,就是告诉浏览器这个资源是稍后的页面中要用到的。而指定为subresource则表示在本页中就会用到,期望能在使用前加载。两者不同的语义让resource loader有不同的行为。prefetch的优先级较低,一般只会在页面加载完成后才会开始。而subresource则会在解析出来时就被尝试优先执行。


还要注意,prefetch是HTML5的一部分,Firefox和Chrome都可以支持。但subresource还只能用在Chrome 中。


应用Browser Prefreshing优化资源加载


不过,并不是所有的Web开发者会愿意加入上面所述的subresource relation, 就算加了,也要等收到主文档并解析出这些内容才行,这段时间开销依赖于服务器的响应时间和客户端与服务器间的延迟时间,甚至要耗去上千毫秒。


和前面的预解析,预连接一样,这里还有一个prefreshing::

  • 用户初始化一个目标页面的请求。
  • Chrome查询Predictor之前针对目标页面的子资源加载,初始化一组DNS预解析,TCP预连接及资源prefreshing。
  • 如是在缓存中发现之前记录的子资源,由从磁盘中加载到内存中。
  • 如果没有或者已经过期了,就是发送网络请求。



直到在2013年初, prefreshing还是处于早期的讨论阶段。如果通过数据结果分析,这个功能最终上线了,我们就可以稍晚些时候使用到它了。


使用预渲染优化页面浏览


前面讨论的每个优化都用来帮助减少用户发起请求到看到页面内容的延迟时间。多快才能带来即时呈现的体验呢?基于用户体验数据,这个时间是100毫秒,根本没给网络延迟留什么空间。而在100毫秒内,又怎样渲染页面呢?


大家可能都有这样的体验: 同时开多个页签时会明显快于在一个页签中等待。浏览器为此提供了一个实现方式:

  <link rel="prerender" href="http://example.org/index.html">


这就是Chrome的预渲染(prerendering in Chrome)! 相对于只下载一个资源的“prefetch", "prerender"会让Chrome在一个不可见的页签中渲染一个页面,包含了它所有的子资源。当用户要浏览它时,这个页签被切到前台,做到了即时的体验。


可以浏览 prerender-test.appspot.com 来体验一下效果,再通过chrome://net-internals/#prerender查看下历史记录和预连接页面的状态。


因为预渲染会同时消耗CPU和网络资源,因些一定要在确信预渲染页面会被使用到情况下才用。Google Search就在它的搜索结果里加入prerender, 因为第一个搜索结果很可能就是下一个页面(也叫作Google Instant Pages)

你可以使用预渲染特性,但以下限制项一定要牢记:

  • 所有的进程中最多只能有一个预渲染页。
  • HTTPS和带有HTTP认证的页面不可以预渲染。
  • 如果请求资源需要发起非幂等(non-idempotent,idempotent request的意义为发起多次,不会带来服务的负面响应的请求)的请求(只有GET请求)时,预渲染也不可用。
  • 所有的资源的优先级都很低。
  • 页面渲染进程的使用最低的CPU优先级。
  • 如果需要超过100MB的内存,将无法使用预渲染。
  • 不支持HTML5多媒体元素。


预渲染只能应用于确信安全的页面。另外JavaScript也最好在运行时使用Page Visibility API 来判断一下当前页是否可见(参考 you should be doing anyway) !


最后,总之,Chrome正逐步优化网络延迟和用户体验,让它随着用户的使用越来越快!

Ilya Grigorik is a web performance engineer and developer advocate on the Make The Web Fast team at Google, where he spends his days and nights on making the web fast and driving adoption of performance best practices.
Follow @igrigorik


[译注]终于翻完了,在这个过程还是学习到不少东西,也期待着对大家有所启发。效果最好,当然还是看原文。以后也争取和作者原文一起更新。

转载请注明出处:http://blog.csdn.net/horkychen


这个系列的索引:

  Google Chrome中的高性能网络(一)

  Google Chrome中的高性能网络(二)

  Google Chrome中的高性能网络(三)

  完整的PDF档下载
原文地址: http://www.igvita.com/posa/high-performance-networking-in-google-chrome/

1楼suannai03143天前 10:37您的文章已被推荐到博客首页和个人页侧边栏推荐文章,感谢您的分享。

    
[2] 单例模式的五种写法
    来源: 互联网  发布时间: 2014-02-18
单例模式的5种写法

单例模式(Singleton Pattern):

在平时的开发中,可能会用到单例模式,许多java的笔试题中也会叫笔试者写出单例模式的那几种写法并且分析。那么下面就来轻轻地探讨一下,最简单的设计模式,即单例模式。


单例模式的解释:

GoF对单例模式的定义:保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。说的意思就是一个类在整个程序中就只能有一个实例,并且这个类中要定义一些可以全局访问的属性、方法等。

 

单例模式的要点有三:

1、有且仅有一个实例。 2、自己创建自己的实例。 3、自己向整个应用程序提供这个实例。

 

单例模式的应用场景:

如窗口管理系统、打印缓冲池、文件系统它们都是原型的例子。


单例模式按实例化对象的时间先后可以大体分为两种类型,即饿汉式和懒汉式,接下来将列出5种单例模式的写法,并分析他们缺点。


第一种:饿汉式

/**
 * 单例模式-饿汉式
 */
public class Singleton {
	// 在定义的时候就初始化instance,
	private  static Singleton instance = new Singleton();
	
	// 够造函数必须是私有的,不能被外部直接调用。
	private Singleton(){
	}
	
	// 暴露给外部,提供实例。
	public static Singleton getInstance(){
		return instance;
	}
}
缺点:在加载类的时候就实例化了对象,比较浪费资源。


第二种:懒汉式(一)

/**
 *  单例模式-懒汉式(一)
 */
public class Singleton {
	
	private  static Singleton instance ;
	
	// 够造函数必须是私有的,不能被外部直接调用。
	private Singleton(){
	}
	
	// 暴露给外部,提供实例。
	public static  Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
		}
		return instance ;
	}
}
缺点:多线程不安全。比如两个线程同时进入getInstance()发现instance为空,那么它们都会去执行new Singleton(),从而导致实例不止一个。


第三种:懒汉式(二)- 方法同步

/**
 *  单例模式-懒汉式(二)
 */
public class Singleton {
	private  static Singleton instance ;
	
	// 够造函数必须是私有的,不能被外部直接调用。
	private Singleton(){
	}
	
	// 暴露给外部,提供实例。
	public static synchronized Singleton getInstance(){
		if(instance == null){
			instance = new Singleton();
		}
		return instance ;
	}
}
缺点:对方法进行了同步,解决了多线程访问时的不安全性,但是每次调用getInstance()都会去判断锁的状态,比较耗时。


第四种:懒汉式(三)- 双重检查

/**
 *  单例模式-懒汉式(三)
 */
public class Singleton {
	private  static Singleton instance ;
	
	// 够造函数必须是私有的,不能被外部直接调用。
	private Singleton(){
	}
	
	// 暴露给外部,提供实例。
	public static Singleton getInstance(){
		// 1
		if(instance == null){
			// 2
			synchronized(Singleton.class){
				// 3
				if(instance == null){
					// 4
					instance = new Singleton();
					// 5
				}
			}
		}
		return instance ;
	}
}
优点:双重检测有效地避免了资源浪费的情况,只有在第一次调用getInstance()方法时才会初始化。
第一个if判断存在的必要性在于提高性能,只有第一次调用getInstance()方法是才会被调用。
第二个if判断存在的必要性在于实现单例,当很多线程在同步块外面等待一个个进入时,如果发现instance不为空了,则不实例化。
缺点:在多线程环境中任然不安全。
例如:多线程的涉入可能会导致instance还没有初始化完成就被当做完整的实例返回给了应用程序了。也就是说线程1正在实例化instance,
线程2运行到//1这个位置发现instance不为空,那么按程序的流程就应该返回instance,但是这个时候的instance还未被实例化完成。


第五种:懒汉式(四)- 内部类

/**
 *  单例模式-懒汉式(四)
 */
public class Singleton {
	// 够造函数必须是私有的,不能被外部直接调用。
	private Singleton(){
	}
	
	// 暴露给外部,提供实例。
	public static Singleton getInstance(){
		return SingletonHolder.instance;
	}
	
	// 静态内部内,实现延时加载
	private static class SingletonHolder{
		public static Singleton instance = new Singleton();
	} 
}
优点:实现了延时加载,也就是说没有在类被加载时就去实例话对象。


经过这5种写法各有千秋,都有好有坏,现在大家用双重检查用得比较多,当然我觉得还是懒汉式(四)要好一点,这个跟android里面绑定service很相似,但是仅仅是内部类这一点。




















    
[3] GIPS-NetEQ 最大化话音质量、最小化延迟
    来源: 互联网  发布时间: 2014-02-18
GIPS-NetEQ 最大化语音质量、最小化延迟
1. GIPS NetEQ概述  

          GIPS NetEQ是一项专为IP电信系统开发的高级语音质量处理技术,其能够在大幅提高语音质量的同时,有效地减少由于buffering带来的延时影响。由于其是专门为独立的网络边际设备设计,所以嵌入式的Neteq可以实现窄带或宽带不同的系统实现。窄带模式(8kHz采样率)下,该软件既能够胜任与PSTN交互的能力,也能够为IP电信系统提供较好的话音质量。宽带模式下(16kHz或32kHz),NetEQ能够将IP语音通信提升到一个全新的层次,从而提供比传统电话更好的语音清晰度。在所有的实现中,NetEQ在较高的丢包环境下始终能够保持较高的语音质量。

   NetEQ所有的实现版本都提供灵活的single-ended ,即硬件设计者或软件服务提供商都只需将NetEQ部署在语音的接收端就可以大幅度的提高语音通话质量。NetEQ可以快速的适应变化的网络环境,同时提供相比于其他更好地语音质量。

2. NetEQ主要特性
 NetEQ的主要特性:
  • 大幅度的提高语音质量
  • 最小化抖动缓冲带来的延时影响,相比于最好的动态自适应抖动缓冲技术,NetEQ可以降低延时30~80ms
  • 只需部署在语音接收端
  • 减少网络配置
  • 能够与所有标准的语音编码器兼容


  • NetEQ将先进的、自适应的抖动缓冲控制和PLC机制结合在一个Unit中,这是NetEQ能够提供卓越语音质量的重要原因
      3. NetEQ语音质量

      下面展示了在不同丢包环境下,NetEQ和NetEQ-wb所达到的语音质量,测试数据由Lockheed Martin Global Telecommunications (formerly Comsat)提供。





    Score
    system range: 1 = bad, 2 = poor, 3 = fair, 4 = good, 5 = excellent

    4. NetEQ jitter buffer

    由上图可知,对比与传统的自适应的抖动缓冲区设计机制,NetEQ实现了独特的非时序的处理机制,其结合了智能的抖动缓冲区调节机制和PLC形成了一个独立的处理单元。NetEQ会探测当前的延时变量并在语音播放之前修正语音错误,所以会产生高质量的语音信号。NetEQ实现的高灵敏度的抖动缓冲区调节机制能够快速适应变换的输入抖动,并且其处理十分的高效。
    5. NetEQ规格说明
    下表为NetEQ的主要特性的规格说明书,我在几个比较重要的位置作了标注,主要涉及编码方式、部署方式、jitter buffer 和PLC相关的指标等。
    转载请标明出处:http://write.blog.csdn.net/postedit/10993605


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3