yichao firstname, zeaster nickname, zhang lastname

Showing posts with label tech. Show all posts
Showing posts with label tech. Show all posts

性能准则之一:在遍历集合前一定要判断集合是否为空

例举2个例子:
1使用Iterator对象遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:64%

  public static void main(String[] args) {
    int N = 1000 * 100000;
    List<Integer> list = new ArrayList<Integer>();

    long start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      Iterator<Integer> iter = list.iterator();
      while (iter.hasNext()) {
        System.out.println(iter.next());
      }
    }

    System.out.println(System.currentTimeMillis() - start);                      //==================490
    start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      if (j > 0) {
        Iterator<Integer> iter = list.iterator();
        while (iter.hasNext()) {
          System.out.println(iter.next());
        }
      }
    }
    System.out.println(System.currentTimeMillis() - start);                     //==================180          时间缩短了64%
  }


2 使用for循环遍历集合时,此时遍历前检查集合大小可以缩短执行时间约为:5%
  public static void main(String[] args) {
    int N = 1000 * 10000;
    List<Integer> list = new ArrayList<Integer>();

    long start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      for (int t = 0; t < j; t++) {
        System.out.println(list.get(t));
      }
    }

    System.out.println(System.currentTimeMillis() - start);          //==================190
    start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
      int j = list.size();
      if (j > 0) {
        for (int t = 0; t < j; t++) {
          System.out.println(list.get(t));
        }
      }
    }
    System.out.println(System.currentTimeMillis() - start);         //==================180     时间缩短了5%
  }

active mode OR passive mode on FTP

自从给小黑装上了Mac OS X就再也不想用windows了,不管是xp还是vista,都太蹩脚了
在公司和同事传文件时,苹果自带的ftp服务器就派上了用途。
苹果自带的这个ftp服务器还是很好用的,不需要配置,只需要在sharing中启动ftp服务,打开防火墙就OK了。
但接下来也遇到了一点点麻烦:
同事使用windows自带的ftp命令行工具则可以访问我的ftp服务器,使用flashFXP则无法访问。
后来证实是因为ftp命令行使用active mode(主动模式)所以可以访问,而flashFXP选用passive mode(被动模式)无法访问,不选用被动模式则可以正常访问。

于是google之:
看到这篇文章,疑惑顿释。
主动模式和被动模式是相对于ftp服务器来说的,即是ftp服务器主动同客户端建立通讯socket或ftp服务器被动接受客户端发来的建立通讯socket请求。
ftp以及telnet等老式的通信协议使用了2种端口,一个是命令端口(Command Port),另一个是数据端口(Data Port)
ftp的命令端口是21,这个端口在苹果防火墙设置中被开放。但另一个数据端口是在通信时由客户端随机指定的,如果使用被动模式,客户端使用数据端口进行通信时就会被Mac的防火墙拦住。而使用主动模式时,是ftp服务器使用数据端口和同事的机器建立socket,而同事机器上没有防火墙,因此可以正常访问。

后来,在同事机器上装了天网防火墙,建立了若干规则,很容易就验证了上述想法。

说个有趣的事儿,钥匙与hash函数

G君中午借H君的自行车,自己下楼骑车去看病了。
晚上,H君骑车回家,结果怎么也找不到钥匙了,就call G君过来帮忙找。
G君一眼就找到了,指给H君,H君一看大呼:“这不是我的车啊”
G君:“不能啊,我中午就骑的这个车啊”
H君自己的自行车至今还未找到,只好骑着这个自己钥匙可以打开的车回家了。。。。

hash函数冲突了,哈

看图说话,谈谈adapter,proxy,facade,bridge模式的区别与联系

适用人群:对模式有一定了解,但又死扣区别的人。个人意见,仅供参考。

 

adapter_class vs adapter_object

 

适配器模式有两类,一种叫类适配器(adapter_class),另一类是对象适配器(adapter_object)。它俩的区别主要体现在adapter和adaptee的关系上

如果是类继承关系则为adapter_class,如果是对象属性关系,则是adapter_object

如图所示:

 

 

adapter vs proxy

 

适配模式是将一个类的接口转换成客户希望的另外一个接口。

代理模式是为其他对象提供一种代理以控制对这个对象的访问。

这是我们常见到的定义,但是还是让初学者摸不清头脑,adapter和proxy到底有什么区别?

adapter是适配adaptee和target之间的关系,proxy是realSubject对subject的代理。

adaptee和target无关系,realSubject和subject有继承关系。这就是他们的区别。

请看下图:

 

 

facade vs others

 

facade用于为复杂的子系统定义一个新的简单易用的接口。

它的重点在

1 封装复杂的子系统,对外提供一个简单的访问入口。

2 降低外界和子系统的耦合度。加了facade入口,外界就只依赖facade入口,而不用依赖子系统的其他类。

如图所示:

 


 

bridge vs others

 

bridge用于将一个抽象与多个可能的实现连接起来。

它是解决抽象类与其实现类之间依赖关系问题,可以使得抽象和实现各自独立且动态结合。

它使用了composition替代了inheritance,从而解除了抽象类和实现类间的耦合。体现了Favor object composition over class inheritance。

如图所示

 


intel MMX, SSE, SSE2区别与联系

MMX(MultiMediaExtensions) 多媒体增强指令集
实现了单道指令多道数据流(SIMD,single-instruction, multiple-data)的执行模式
支持MMX指令集的处理器有八个64位的寄存器,这个寄存器可以存放的数据类型有四种:字节(byte)、字(word),双字(double-word)
分别可以存放8,4,2个。
举个例子:
支持MMX指令集就是说原来对每个数组中(byte)元素加一的操作现在可以一次性load 8个元素,一次性对这个八个元素加一
这就是所谓的”单道指令多道数据流“
http://blog.csdn.net/guanchanghui/archive/2006/07/28/989256.aspx 上有个很好的演示代码

SSE(Streaming SIMD Extensions)单指令多数据流式扩展
就是扩展了MMX支持的SIMD,支持SSE指令集的处理器有八个128位的寄存器,另外支持的数据类型多了个单精度浮点型

SSE2
就是扩展了的SSE,它的寄存器支持的数据类型比SSE多了个双精度浮点型

除了在多媒体处理方面,在多线程处理方面,也是它们的英雄用武地!

if One Day I would

If One Day I would search all files on the all of the disks from all of the world pc, laptop, server

of course, just like there is robots.txt in the website, there is robots_local.txt in the local computers.

It's coming by some kind of distributed file system.
that's an interesting job.

How Great GFW is!

最近用python写了个同步del.icio.us和本地ie收藏夹的脚本
可是总会报被 throttled 的错, 按照del.icio.us的api说明, 应该是我过于频繁的使用它的api了
但是我没有啊,我都是每隔2秒才提交一次的,无辜啊 :)
最后,没想到是由于有个收藏项为GFW封杀对象, del.icio.us无法访问此连接,所以无法收藏!
呵呵 伟大的GFW, 没想到有一天会碰到你引起的bug