4月 05

越来越慢的java问题

  新上线了一个接口,但是导致整个服务越来越慢。之前所做的压力测试结果也不错,五百并发只要十几秒。因为没有做疲劳测试,当前看来还是有问题。但是具体哪里出了问题还不清楚,需要详细查看。我也不是java开发所以只能是协助分析,先找了个分析工具看看导致瓶颈的主要原因。下载http://java.net/projects/visualvm/downloads/download/release134/visualvm_134.zip,解压缩后直接使用。
  解压缩后在文件夹的bin目录下有两个可执行文件,一个是exe的windows下使用的,另一个是linux下使用的。直接将解压的目录上传到linux操作系统中。准备运行,需要注意的是,linux下运行需要用到图形化,所以要用putty这类的小工具需要开启X11。
  启动# sh visualvm。在左侧可以看到已经启动的容器,打开resin服务。等待运行一段时间如图:
  经过更长时间对比,确定应该是内存泄露问题。因为内存值不断在增长,直至将系统资源占满。正常的接口,进行压力测试时,内存和CPU的值均比较平衡。具体问题使用sampler进行分析,应该是字符转换存在问题,并且没有释放。我直接反馈给开发人员,具体问题就不清楚了,在此做个简单记录。

4月 04

最接地气的娱乐节目

  为了争夺晚间黄金时间,娱乐节目竞争也很激烈。我很少看,但是有些娱乐节目想不知道也很难,并且也需要看看,不要在聊天时像个外星人。回老家的时候,因为家里没有交有线电视费,以为不能看了,偶然发现在和河北省可以看河北电视台。看到节目“家政女皇”,主要介绍生活中的小窍门和生活相关的科学知识。之前也很过,但是没有太在意,今天一看还添加了一个学新闻类的片段,太搞笑了。推荐大家看看。在加上河北台的“村里那点事”。我和老婆讨论了一下,将河北电视台评委最接地气的娱乐节目。推荐中。

4月 01

C、go、python、java、php和node.js 简单循环累加运算速度测试

【张子萌 www.simonzhang.net 2012-4-1】
【张子萌 www.simonzhang.net 2012-8-8 修改增加go语言】

之前简单做了一下node.js和python的“hello ***”的页面测试,也做了循环的测试,本次主要是增加了java的语言,go语言。主要是想看一下主流四种脚本的速度java、python、php、c语言。均使用for循环进行简单的累加测试。个人技能有限所以只做了简单测试做参考。

实验环境使用linux 64位服务器,操作系统为contos 5.4,php版本5.1.6,python版本为2.6.6,node.js版本为0.4.12,java版本为1.6.0_03,gcc 版本 4.1.2 2008070,go语言为1.0.2。
一、脚本编写
php脚本
# cat test.php

python脚本
# cat test.py

#!/bin/env python
#-*- coding:utf-8 -*-
def main():
    j = 0;
    for i in xrange(10000000):
        j=j+i
    print j

if __name__=="__main__":
    main()

node.js脚本
# cat test.js

var j=0;
for (i = 0; i < 10000000; i++ ) {
   j=j+i
}
    console.log(j);

Java代码:
# cat Test.java

public class Test {
public static void main(String[] args) {
          long n = 0;
          for (int i = 0; i < 10000; i++) {
               n=n+i;
          }
          System.out.println(n);
     }
}

C语言,使用gcc编译,编译两种结果,一种是直接编译的,一种是优化编译的。

#include 
#include 
main()
{
    long i,j=0;
    for (i=0 ; i<10000000 ; i++)
       j=j+i;
    printf("%ld\n",j);
}

go语言代码

package main

import "fmt"

func main() {
    var sum,i int64
    sum=0
    for i=0;i<10000000;i++{
        sum+=i
    }
    fmt.Printf("%d",sum)
}

二、运行结果
使用time命令对程序运行时间进行统计

以下是循环一千万次的累加测试结果。

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.024s 0.001s 0.011s 0.420s 1.055s 1.429s 0.087
User 0.023s 0.000s 0.011s 0.401s 1.046s 1.423s 0.067
sys 0.001s 0.001s 0.000s 0.019s 0.009s 0.007s 0.015

以下是循环一万次的累加测试结果

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.001s 0.001s 0.004s 0.090s 0.027s 0.014s 0.087
User 0.000s 0.001s 0.003s 0.080s 0.022s 0.007s 0.041
sys 0.001s 0.000s 0.002s 0.010s 0.006s 0.007s 0.017

三、结论
从简单的测试来看,c语言不是一般的快,大数据计算情况下node.js速度最快,java次之,python和php比慢。但是如果是少量计算时php效果还是很不错。但是实际应用中,还需要调用各种函数和各方面的资源,并不能以一个空框架下的for来判断。go的速度与C相当,但是编译速度还是比C要慢一点,以上的代码C编译完只有6K多,go编译完有1.3M。每种语言都会有自己擅长的一方面,速度快与慢,还与编写的技巧性有关。学好每一步,认认真真踏实的做就好了。

注:C、go和java被编译后会对代码进行优化。各自不同的编译器优化的侧重也不一样,所以这个测试有些失实。比如即使循环数再大java时间也不会有改变,估计是在编译时已经将for里的值计算完毕,运行时直接取结果。有兴趣的可以学习编译原理。