5月 29

post数据到golang服务和python的pypy服务后数据入库库效率测试

  在测试go语言和pypy接收post参数后,数据入库的效率。服务器使用阿里云的基础服务器,512内存单核CentOS6.3 64位服务器。测试还有上传文件部分。此处只列出了部分代码。
  python使用tornado在pypy1.9环境,python代码没有列出。
  go语言代码如下。数据库配置部分写成可以全局调用的。

package main

import (
	"fmt"
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
	"net/http"
)

func mydb()*sql.DB {
    //配置数据库连接地址
    db, e:= sql.Open("mysql", "test:1111111@tcp(192.168.1.130:3306)/test?charset=utf8")
    checkErr(e)
    fmt.Println(db)
    return db
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
        //用于获取插入数据的表id
        var get_id string
	if r.Method == "POST" {
            r.ParseForm()
	    //获取获得的参数
	    get_time:=r.FormValue("time")
            get_mac:=r.FormValue("mac")
            get_md5:=r.FormValue("md5")
	    //插入数据
            stm, e := mydb().Prepare("INSERT INTO `video` set mac=?, md5=?, createDate=?")
            checkErr(e)
            result,e:=stm.Exec(get_mac, get_md5, get_time)
            checkErr(e)
	    //获取插入后数据的id
            id,e:= result.LastInsertId()
            checkErr(e)
	    //返回给客户
            get_id = fmt.Sprint(id)
            context := "Insert id:" + get_id
	    w.Write([]byte(context))
        }
}

func main() {
     http.HandleFunc("/", IndexHandler)
     http.ListenAndServe(":8899", nil)
}

  测试结果:单进程情况下,go语言的速度比pypy的稍慢,基本持平相差不到5%。但是go使用内存量占到45%,cpu使用8%左右。pypy使用内存20%,cpu使用在5%左右。如果多进程pypy可以启动4个,go只能启动两个。这样pypy比go的处理速去应该快一倍多。java代码也有测试,使用tomcat7,因为逻辑更复杂,所以不能参加对比,粗略估计go会比java快40%。
测试代码

3月 29

linux下python、go、C库处理图片缩放效率对比

  找到go语言的源码
https://github.com/nfnt/resize
http://code.google.com/p/gorilla/source/browse/lib/appengine/example/moustachio/resize/resize.go?r=3dbce6e267e9d497dffbce31220a059f02c4e99d

  使用’go get ‘安装需要使用git。如果是centos 6 直接安装’yum install git’。但是我的是CentOS 5 还要手动安装一下。
# yum install -y gcc make curl curl-devel zlib-devel openssl-devel perl perl-devel

cpio expat-devel gettext-devel
# wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
# tar zxvf git-latest.tar.gz
# cd git-2013-03-28/
# autoconf
# ./configure
# make && make install
# git –version

  git安装完成,开始测试。我的环境,python2.6,go1.0.2,ImageMagick是C/C++语言开发使用也比较广泛。直接用命令测试。。使用一张150k 510×382的图片做测试。缩成宽300的等比例缩小图。

# go get github.com/nfnt/resize

go 测试代码

package main

import (
    "github.com/nfnt/resize"
    "image/jpeg"
    "os"
)

func main() {
    // open "test.jpg"
    file, err := os.Open("test.jpg")
    if err != nil {
        print("Open File Error")
    }

    // decode jpeg into image.Image
    img, err := jpeg.Decode(file)
    if err != nil {
        print("Not image file")
    }
    file.Close()

    // resize to width 1000 using Lanczos resampling
    // and preserve aspect ratio
    m := resize.Resize(300, 0, img, resize.Lanczos3)

    out, err := os.Create("test_go.jpg")
    if err != nil {
        print("Save Image Error!")
    }
    defer out.Close()

    // write new image to file
    jpeg.Encode(out, m, nil)
}

python 测试代码

#!/bin/env python
# -*- coding:utf-8 -*-
# --------------------------------
# Filename:    cut_image.py
# Revision:    1.1
# Author:      simon-zzm
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# --------------------------------
import Image


def main():
    file = Image.open('test.jpg')
    w = file.size[0]
    h = file.size[1]
    re_data = file.resize((300, int(h/(float(w)/300))),)
    re_data.save('test_py.jpg', 'JPEG',)


if __name__ == '__main__':
    main()

  在linux下使用time进行测试结果
# time python cut_image.py

real 0m0.051s
user 0m0.040s
sys 0m0.009s

# time go run cut_image.go

real 0m2.736s
user 0m2.695s
sys 0m0.039s

# time convert -resize 300x test.jpg test_c.jpg

real 0m0.073s
user 0m0.070s
sys 0m0.002s

-rw-r–r– 1 root root 150332 Jul 16 2012 test.jpg
-rw-r–r– 1 root root 12929 Mar 28 23:13 test_go.jpg
-rw-r–r– 1 root root 13087 Mar 28 23:13 test_py.jpg
-rw-r–r– 1 root root 58591 Mar 28 23:14 test_c.jpg

总结:GO使用这个方法作为图片缩放的处理速度和python处理速度的差距太大了。烦请高手指点如何处理。不过GO的语法还是比较简单,值得学习。之前做的多语言简单累加计算测试,GO效率还是比较高,所以处理业务逻辑处理的效率还应该不错。
源码下载

12月 05

go语言跑在Raspberry pi 上

  之前go语言在HTC的android手机上运行正常,所以在raspberry pi上也应该没有问题。所以测试一下,如果可以又多了一种开发方法。下载go1.0.3.

安装需要的包
$ sudo apt-get install mercurial bison gcc libc6-dev ed gawk make git

配置环境变量,将以下配置放在profile文件的最底部,为了方便直接用go源码编译,直接放在家目录里。
$ sudo vi /etc/profile
export GOARM=5
export GOROOT=/home/pi/go
export GOARCH=arm
export GOOS=linux
export PATH=$PATH;/home/pi/go/bin/

开始编译
$ cd go/src/
$ time ./all.bash

经过漫长的等待终于编译完了,耗时如下。
real 49m48.591s
user 44m33.760s
sys 2m7.540s

直接用之前的代码测试http://www.simonzhang.net/?p=1346。运行成功。

9月 14

golang使用参数

  备忘
package main

import (“fmt”
“flag”
)
//参数名, 参数默认值,参数说明
var (loopnum =flag.Int(“l”,10,”loop num.”)
loopurl =flag.String(“u”,”www.simonzhang.net”,”get url.”)
)

func main() {
flag.Parse()
fmt.Println(“loop num:”, loopnum)
fmt.Println(“url:”, *loopurl)
}

编译后使用
flag -l=11 -u=http://www.simonzhang.net

9月 13

go语言的程序跑在android上

  之前写了一个检查页面的golang程序http://www.simonzhang.net/?p=1346。就用这个测试一下放到android上看看效果如何。但是我在windows上的golang还是产生不了5g。我就直接到linux上编译,但是linux上使用adb又不方便,只能是编译后在转到windows上测试。好在我的linux是跑在虚拟机上,处理起来还算方便。为了编译和测试方便,我又编译了一个androidgo放在/usr/local/下,在搞个用户把环境变量配成arm的。也可以直接CGO_ENABLED=0 GOOS=linux GOARCH=arm go build android-check-url.go 编译,就不用这么麻烦了。

  开始,还是用之前的代码没有进行修改。开始进行编译。代码从http://www.simonzhang.net/?p=1346里拷贝。
# go tool 5g android-checl-url
# go tool 5l android-check-url.5
# mv 5.out android-check-url

图a

  将编译好的大文件(2.7M)放到E:盘中。然后放到手机上测试。
>adb push E:\android-check-url /data/local
>adb push E:\url.txt /data/local
>adb shell
#cd /data/local
#chmod 755 android-check-url
#./android-check-url
出错了
Get http://www.simonzhang.net: error reading DNS config: open /etc/resolv.conf: no such file or directory
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x20 pc=0x11174]

goroutine 1 [running]:
main.main()
/root/android-go/android-check-url.go:31 +0x574

goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
#

图b

  报错显示找不到dns的配置文件。很是奇怪那现在的程序是怎么解析的。这个先不搞清楚了,先手动建个dns的配置文件,只用google的dns进行解析(这个操作也是参考一个国外的帖子,但是浏览器不小心关掉了所以不能贴出地址)。

图c

  再次进入手机运行程序。运行成功

图d